xbolva00 created this revision. xbolva00 added a reviewer: aaron.ballman. Herald added a project: clang. Herald added a subscriber: cfe-commits. xbolva00 requested review of this revision.
Motivation (from PR37674): const char *ss[] = { "foo", "bar", "baz", "qux" // <-- Missing comma! "abc", "xyz" }; This kind of bug was recently also found in LLVM codebase (see PR47038). Solves PR47038, PR37674 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D85545 Files: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaExpr.cpp clang/test/Sema/string-concat.c Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -6907,6 +6907,11 @@ << DIE->getSourceRange(); Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed) << InitArgList[I]->getSourceRange(); + } else if (StringLiteral *SL = dyn_cast<StringLiteral>(InitArgList[I])) { + unsigned numConcat = SL->getNumConcatenated(); + // Diagnose missing comma in string array initialization. + if (numConcat > 1) + Diag(SL->getBeginLoc(), diag::warn_concatenated_literal_array_init); } } Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2999,6 +2999,10 @@ def warn_objc_string_literal_comparison : Warning< "direct comparison of a string literal has undefined behavior">, InGroup<ObjCStringComparison>; +def warn_concatenated_literal_array_init : Warning< + "concatenated literal in a string array initialization - " + "possibly missing a comma">, + InGroup<DiagGroup<"string-concatenation">>; def warn_concatenated_nsarray_literal : Warning< "concatenated NSString literal for an NSArray expression - " "possibly missing a comma">, Index: clang/test/Sema/string-concat.c =================================================================== --- /dev/null +++ clang/test/Sema/string-concat.c @@ -0,0 +1,41 @@ + +// RUN: %clang_cc1 -x c -fsyntax-only -verify %s +// RUN: %clang_cc1 -x c++ -fsyntax-only -verify %s + +const char *test1[] = { + "basic_filebuf", + "basic_ios", + "future", + "optional", + "packaged_task" // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + "promise", + "shared_future", + "shared_lock", + "shared_ptr", + "thread", + "unique_ptr", + "unique_lock", + "weak_ptr", +}; + +const char *test2[] = {"basic_filebuf", + "basic_ios" // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + "future" + "optional", + "packaged_task"}; + +const char *test3[] = {"basic_filebuf", "basic_ios", + "future" "optional", // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + "packaged_task", "promise"}; + +const char *test4[] = {"basic_filebuf", "basic_ios" // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + "future", "optional", + "packaged_task", "promise"}; + +#define BASIC_IOS "basic_ios" +#define FUTURE "future" +const char *test5[] = {"basic_filebuf", BASIC_IOS // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + FUTURE, "optional", + "packaged_task", "promise"}; + +const char *test6[] = {"basic_filebuf", "future" "optional", "packaged_task"}; // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}}
Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -6907,6 +6907,11 @@ << DIE->getSourceRange(); Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed) << InitArgList[I]->getSourceRange(); + } else if (StringLiteral *SL = dyn_cast<StringLiteral>(InitArgList[I])) { + unsigned numConcat = SL->getNumConcatenated(); + // Diagnose missing comma in string array initialization. + if (numConcat > 1) + Diag(SL->getBeginLoc(), diag::warn_concatenated_literal_array_init); } } Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2999,6 +2999,10 @@ def warn_objc_string_literal_comparison : Warning< "direct comparison of a string literal has undefined behavior">, InGroup<ObjCStringComparison>; +def warn_concatenated_literal_array_init : Warning< + "concatenated literal in a string array initialization - " + "possibly missing a comma">, + InGroup<DiagGroup<"string-concatenation">>; def warn_concatenated_nsarray_literal : Warning< "concatenated NSString literal for an NSArray expression - " "possibly missing a comma">, Index: clang/test/Sema/string-concat.c =================================================================== --- /dev/null +++ clang/test/Sema/string-concat.c @@ -0,0 +1,41 @@ + +// RUN: %clang_cc1 -x c -fsyntax-only -verify %s +// RUN: %clang_cc1 -x c++ -fsyntax-only -verify %s + +const char *test1[] = { + "basic_filebuf", + "basic_ios", + "future", + "optional", + "packaged_task" // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + "promise", + "shared_future", + "shared_lock", + "shared_ptr", + "thread", + "unique_ptr", + "unique_lock", + "weak_ptr", +}; + +const char *test2[] = {"basic_filebuf", + "basic_ios" // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + "future" + "optional", + "packaged_task"}; + +const char *test3[] = {"basic_filebuf", "basic_ios", + "future" "optional", // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + "packaged_task", "promise"}; + +const char *test4[] = {"basic_filebuf", "basic_ios" // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + "future", "optional", + "packaged_task", "promise"}; + +#define BASIC_IOS "basic_ios" +#define FUTURE "future" +const char *test5[] = {"basic_filebuf", BASIC_IOS // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}} + FUTURE, "optional", + "packaged_task", "promise"}; + +const char *test6[] = {"basic_filebuf", "future" "optional", "packaged_task"}; // expected-warning{{concatenated literal in a string array initialization - possibly missing a comma}}
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits