[PATCH] D85545: [Diagnostics] Diagnose missing comma in string array initialization

Arthur O'Dwyer via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 7 13:30:06 PDT 2020


Quuxplusone added inline comments.


================
Comment at: clang/lib/Sema/SemaExpr.cpp:6916
+        for (unsigned i = 0; i < numConcat; ++i)
+          if (SL->getStrTokenLoc(i).isMacroID()) {
+            hasMacro = true;
----------------
I wonder if perhaps the warning should trigger only if the concatenated pieces appear one-per-line, i.e., whitespace-sensitive.

    const char a[] = {
        "a"
        "b"
    };
    const char b[] = {
        "b" "c"
    };

It's at least arguable that `a` is a bug and `b` is intentional, based purely on how the whitespace appears. OTOH, whitespace is not preserved by clang-format, and it would suck for clang-formatting the code to cause the appearance (or disappearance) of diagnostics.


================
Comment at: clang/test/Sema/string-concat.c:55
+                       "optional",
+                       "packaged_task"};
----------------
> What if the user did actually want to concatenate the strings

> Is there a way to suppress this diagnostic

Sounds like if someone wanted to suppress the diagnostic, it would suffice for them to add a macro invocation:

    #define SUPPRESS(x) x
    const char *test9[] = { SUPPRESS("foo" "bar"), "baz" };

Please add this test case. Please also add one for concatenation //with the result of// a macro, as in

    #define ONE(x) x
    #define TWO "foo"
    const char *test10[] = { ONE("foo") "bar", TWO "bar", "foo" TWO };

I would expect and hope that the diagnostic would catch all three of these cases.

It would also be nice to check a case like

    char test11[][4] = {
        "a",
        "b"
        "c"
    };

where the string literal is being used to initialize an array not a pointer.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D85545/new/

https://reviews.llvm.org/D85545



More information about the cfe-commits mailing list