https://github.com/StarOne01 updated https://github.com/llvm/llvm-project/pull/123495
>From 11889be9b1e203c192559d2a94c49a9874eb1351 Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Sun, 19 Jan 2025 07:28:24 +0530 Subject: [PATCH 01/13] [clang][Sema] Add diagnostic note for function-like macros requiring parentheses --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ clang/lib/Sema/SemaExpr.cpp | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 9bd0a526654c7..faa3fef1a1c74 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6345,6 +6345,8 @@ def err_fold_expression_limit_exceeded: Error< "instantiating fold expression with %0 arguments exceeded expression nesting " "limit of %1">, DefaultFatal, NoSFINAE; +def note_function_like_macro_requires_parens : Note< + "'%0' exists, but as a function-like macro; perhaps, did you forget the parentheses?">; def err_unexpected_typedef : Error< "unexpected type name %0: expected expression">; def err_unexpected_namespace : Error< diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index c93efeb928c56..dc23c9ebb4711 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2690,6 +2690,19 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, DC = DC->getLookupParent(); } + // Check whether a similar function-like macro exists and suggest it + if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { + if (II->hasMacroDefinition()) { + MacroInfo *MI = PP.getMacroInfo(II); + if (MI && MI->isFunctionLike()) { + Diag( R.getNameLoc() ,diag::err_undeclared_var_use) << II->getName(); + Diag(MI->getDefinitionLoc(), diag::note_function_like_macro_requires_parens) + << II->getName(); + return true; + } + } + } + // We didn't find anything, so try to correct for a typo. TypoCorrection Corrected; if (S && (Corrected = @@ -2791,7 +2804,7 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, << Name << computeDeclContext(SS, false) << NameRange; return true; } - + // Give up, we can't recover. Diag(R.getNameLoc(), diagnostic) << Name << NameRange; return true; >From 83b06d43ab80470f8dbc9324b65a7781929b3d46 Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Sun, 19 Jan 2025 08:30:39 +0530 Subject: [PATCH 02/13] [clang][Tests] Modify tests for function-like macros according to the new behavior and Format the changes --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 5 +++-- clang/lib/Sema/SemaExpr.cpp | 7 ++++--- clang/test/Preprocessor/macro_with_initializer_list.cpp | 6 ++++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index faa3fef1a1c74..baabacbdd3c9c 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6345,8 +6345,9 @@ def err_fold_expression_limit_exceeded: Error< "instantiating fold expression with %0 arguments exceeded expression nesting " "limit of %1">, DefaultFatal, NoSFINAE; -def note_function_like_macro_requires_parens : Note< - "'%0' exists, but as a function-like macro; perhaps, did you forget the parentheses?">; +def note_function_like_macro_requires_parens + : Note<"'%0' exists, but as a function-like macro; perhaps, did you forget " + "the parentheses?">; def err_unexpected_typedef : Error< "unexpected type name %0: expected expression">; def err_unexpected_namespace : Error< diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index dc23c9ebb4711..184257b3bb6a1 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2695,8 +2695,9 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, if (II->hasMacroDefinition()) { MacroInfo *MI = PP.getMacroInfo(II); if (MI && MI->isFunctionLike()) { - Diag( R.getNameLoc() ,diag::err_undeclared_var_use) << II->getName(); - Diag(MI->getDefinitionLoc(), diag::note_function_like_macro_requires_parens) + Diag(R.getNameLoc(), diag::err_undeclared_var_use) << II->getName(); + Diag(MI->getDefinitionLoc(), + diag::note_function_like_macro_requires_parens) << II->getName(); return true; } @@ -2804,7 +2805,7 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, << Name << computeDeclContext(SS, false) << NameRange; return true; } - + // Give up, we can't recover. Diag(R.getNameLoc(), diagnostic) << Name << NameRange; return true; diff --git a/clang/test/Preprocessor/macro_with_initializer_list.cpp b/clang/test/Preprocessor/macro_with_initializer_list.cpp index 40f53164b263d..cc7dae0b5a3e0 100644 --- a/clang/test/Preprocessor/macro_with_initializer_list.cpp +++ b/clang/test/Preprocessor/macro_with_initializer_list.cpp @@ -134,6 +134,7 @@ void test_NE() { // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:32-110:32}:")" #define INIT(var, init) Foo var = init; // expected-note 3{{defined here}} +// expected-note@-1 2{{'INIT' exists, but as a function-like macro; perhaps, did you forget the parentheses?}} // Can't use an initializer list as a macro argument. The commas in the list // will be interpretted as argument separaters and adding parenthesis will // make it no longer an initializer list. @@ -159,12 +160,13 @@ void test() { // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}} } -// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:11-145:11}:"(" -// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:23-145:23}:")" +// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{146:11-146:11}:"(" +// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{146:23-146:23}:")" #define M(name,a,b,c,d,e,f,g,h,i,j,k,l) \ Foo name = a + b + c + d + e + f + g + h + i + j + k + l; // expected-note@-2 2{{defined here}} +// expected-note@-3 {{'M' exists, but as a function-like macro; perhaps, did you forget the parentheses?}} void test2() { M(F1, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo()); >From 1deb668c83ef7cca313092ffa082fd5b4c133faf Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Mon, 20 Jan 2025 13:34:48 +0530 Subject: [PATCH 03/13] Change the note for reference of function-like macros requiring without parentheses Co-authored-by: Sirraide <[email protected]> --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index baabacbdd3c9c..453e186c62e15 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6346,8 +6346,7 @@ def err_fold_expression_limit_exceeded: Error< "limit of %1">, DefaultFatal, NoSFINAE; def note_function_like_macro_requires_parens - : Note<"'%0' exists, but as a function-like macro; perhaps, did you forget " - "the parentheses?">; + : Note<"'%0' is defined here as a function-like macro; did you mean to write '%0(...)'">; def err_unexpected_typedef : Error< "unexpected type name %0: expected expression">; def err_unexpected_namespace : Error< >From 1bd69fb8ffe5f8951f8cb9446e455397ea72ca2d Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Tue, 21 Jan 2025 16:20:10 +0530 Subject: [PATCH 04/13] [clang][Tests] Update diagnostic tests for function-like macros to clarify usage and improve error messages --- .../Preprocessor/macro_with_initializer_list.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/clang/test/Preprocessor/macro_with_initializer_list.cpp b/clang/test/Preprocessor/macro_with_initializer_list.cpp index cc7dae0b5a3e0..f7f645cce1180 100644 --- a/clang/test/Preprocessor/macro_with_initializer_list.cpp +++ b/clang/test/Preprocessor/macro_with_initializer_list.cpp @@ -133,8 +133,8 @@ void test_NE() { // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:9-110:9}:"(" // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:32-110:32}:")" -#define INIT(var, init) Foo var = init; // expected-note 3{{defined here}} -// expected-note@-1 2{{'INIT' exists, but as a function-like macro; perhaps, did you forget the parentheses?}} +#define INIT(var, init) Foo var = init; // expected-note 3{{macro 'INIT' defined here}} +// expected-note@-1 2{{'INIT' is defined here as a function-like macro; did you mean to write 'INIT(...)'}} // Can't use an initializer list as a macro argument. The commas in the list // will be interpretted as argument separaters and adding parenthesis will // make it no longer an initializer list. @@ -166,7 +166,7 @@ void test() { #define M(name,a,b,c,d,e,f,g,h,i,j,k,l) \ Foo name = a + b + c + d + e + f + g + h + i + j + k + l; // expected-note@-2 2{{defined here}} -// expected-note@-3 {{'M' exists, but as a function-like macro; perhaps, did you forget the parentheses?}} +// expected-note@-3 {{'M' is defined here as a function-like macro; did you mean to write 'M(...)'}} void test2() { M(F1, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo()); @@ -182,3 +182,11 @@ void test2() { // expected-error@-3 {{use of undeclared identifier}} // expected-note@-4 {{cannot use initializer list at the beginning of a macro argument}} } + +#define LIM() 10 +// expected-note@-1 {{'LIM' is defined here as a function-like macro; did you mean to write 'LIM(...)'}} + +void test3() { + int iter = LIM; + // expected-error@-1 {{use of undeclared identifier LIM}} +} \ No newline at end of file >From 8e5ea45f63f010758a381d1a6ca3afeaed78a3cd Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Tue, 21 Jan 2025 16:22:39 +0530 Subject: [PATCH 05/13] Change the note for reference of function-like macros requiring without parentheses Co-authored-by: Mariya Podchishchaeva <[email protected]> --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 453e186c62e15..54e161d9645ac 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6346,7 +6346,7 @@ def err_fold_expression_limit_exceeded: Error< "limit of %1">, DefaultFatal, NoSFINAE; def note_function_like_macro_requires_parens - : Note<"'%0' is defined here as a function-like macro; did you mean to write '%0(...)'">; + : Note<"'%0' is defined here as a function-like macro; did you mean '%0(...)'">; def err_unexpected_typedef : Error< "unexpected type name %0: expected expression">; def err_unexpected_namespace : Error< >From 5f0569178eb0f58ef2c30c23c6ae6f80327475d9 Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Tue, 21 Jan 2025 17:03:21 +0530 Subject: [PATCH 06/13] [clang][Tests] Update diagnostic tests for function-like macros for the updated note --- clang/test/Preprocessor/macro_with_initializer_list.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/test/Preprocessor/macro_with_initializer_list.cpp b/clang/test/Preprocessor/macro_with_initializer_list.cpp index f7f645cce1180..cf1d137eadcbe 100644 --- a/clang/test/Preprocessor/macro_with_initializer_list.cpp +++ b/clang/test/Preprocessor/macro_with_initializer_list.cpp @@ -134,7 +134,7 @@ void test_NE() { // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:32-110:32}:")" #define INIT(var, init) Foo var = init; // expected-note 3{{macro 'INIT' defined here}} -// expected-note@-1 2{{'INIT' is defined here as a function-like macro; did you mean to write 'INIT(...)'}} +// expected-note@-1 2{{'INIT' is defined here as a function-like macro; did you mean 'INIT(...)'}} // Can't use an initializer list as a macro argument. The commas in the list // will be interpretted as argument separaters and adding parenthesis will // make it no longer an initializer list. @@ -166,7 +166,7 @@ void test() { #define M(name,a,b,c,d,e,f,g,h,i,j,k,l) \ Foo name = a + b + c + d + e + f + g + h + i + j + k + l; // expected-note@-2 2{{defined here}} -// expected-note@-3 {{'M' is defined here as a function-like macro; did you mean to write 'M(...)'}} +// expected-note@-3 {{'M' is defined here as a function-like macro; did you mean 'M(...)'}} void test2() { M(F1, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo()); @@ -184,7 +184,7 @@ void test2() { } #define LIM() 10 -// expected-note@-1 {{'LIM' is defined here as a function-like macro; did you mean to write 'LIM(...)'}} +// expected-note@-1 {{'LIM' is defined here as a function-like macro; did you mean 'LIM(...)'}} void test3() { int iter = LIM; >From 1bd294622e1808049cf3a451db524f8d3c87c041 Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Sun, 9 Feb 2025 14:20:36 +0530 Subject: [PATCH 07/13] [clang][Sema] Improve diagnostics for undeclared function-like macros --- .../clang/Basic/DiagnosticSemaKinds.td | 4 +- clang/lib/Sema/SemaExpr.cpp | 74 +++++++++++++++---- .../macro_with_initializer_list.cpp | 14 +--- clang/test/Sema/typo-correction.c | 22 ++++++ 4 files changed, 87 insertions(+), 27 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 54e161d9645ac..739aad0b516a8 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6346,7 +6346,7 @@ def err_fold_expression_limit_exceeded: Error< "limit of %1">, DefaultFatal, NoSFINAE; def note_function_like_macro_requires_parens - : Note<"'%0' is defined here as a function-like macro; did you mean '%0(...)'">; + : Note<"'%0' defined here as a function-like macro">; def err_unexpected_typedef : Error< "unexpected type name %0: expected expression">; def err_unexpected_namespace : Error< @@ -11691,6 +11691,8 @@ def err_undeclared_use_suggest : Error< "use of undeclared %0; did you mean %1?">; def err_undeclared_var_use_suggest : Error< "use of undeclared identifier %0; did you mean %1?">; +def err_undeclared_var_use_suggest_func_like_macro + : Error<"use of undeclared identifier %0; did you mean %0(...)?">; def err_no_template : Error<"no template named %0">; def err_no_template_suggest : Error<"no template named %0; did you mean %1?">; def err_no_member_template : Error<"no template named %0 in %1">; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 184257b3bb6a1..173094f730723 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2548,6 +2548,27 @@ Sema::BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, return E; } +// Check whether a similar function-like macro exists and suggest it +static bool isFunctionLikeMacro(const DeclarationName &Name, Sema &SemaRef, + const SourceLocation &TypoLoc) { + + if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { + if (II->hasMacroDefinition()) { + MacroInfo *MI = SemaRef.PP.getMacroInfo(II); + if (MI && MI->isFunctionLike()) { + SemaRef.Diag(TypoLoc, + diag::err_undeclared_var_use_suggest_func_like_macro) + << II->getName(); + SemaRef.Diag(MI->getDefinitionLoc(), + diag::note_function_like_macro_requires_parens) + << II->getName(); + return true; + } + } + } + return false; +} + void Sema::DecomposeUnqualifiedId(const UnqualifiedId &Id, TemplateArgumentListInfo &Buffer, @@ -2571,6 +2592,42 @@ Sema::DecomposeUnqualifiedId(const UnqualifiedId &Id, } } +static void emitEmptyLookupTypoDiagnostic( + const TypoCorrection &TC, Sema &SemaRef, const CXXScopeSpec &SS, + DeclarationName Typo, SourceLocation TypoLoc, ArrayRef<Expr *> Args, + unsigned DiagnosticID, unsigned DiagnosticSuggestID) { + DeclContext *Ctx = + SS.isEmpty() ? nullptr : SemaRef.computeDeclContext(SS, false); + if (!TC) { + // Emit a special diagnostic for failed member lookups. + // FIXME: computing the declaration context might fail here (?) + if (Ctx) + SemaRef.Diag(TypoLoc, diag::err_no_member) << Typo << Ctx + << SS.getRange(); + else { + if (isFunctionLikeMacro(Typo, SemaRef, TypoLoc)) + return; + SemaRef.Diag(TypoLoc, DiagnosticID) << Typo; + } + return; + } + + std::string CorrectedStr = TC.getAsString(SemaRef.getLangOpts()); + bool DroppedSpecifier = + TC.WillReplaceSpecifier() && Typo.getAsString() == CorrectedStr; + unsigned NoteID = TC.getCorrectionDeclAs<ImplicitParamDecl>() + ? diag::note_implicit_param_decl + : diag::note_previous_decl; + if (!Ctx) + SemaRef.diagnoseTypo(TC, SemaRef.PDiag(DiagnosticSuggestID) << Typo, + SemaRef.PDiag(NoteID)); + else + SemaRef.diagnoseTypo(TC, SemaRef.PDiag(diag::err_no_member_suggest) + << Typo << Ctx << DroppedSpecifier + << SS.getRange(), + SemaRef.PDiag(NoteID)); +} + bool Sema::DiagnoseDependentMemberLookup(const LookupResult &R) { // During a default argument instantiation the CurContext points // to a CXXMethodDecl; but we can't apply a this-> fixit inside a @@ -2690,20 +2747,6 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, DC = DC->getLookupParent(); } - // Check whether a similar function-like macro exists and suggest it - if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { - if (II->hasMacroDefinition()) { - MacroInfo *MI = PP.getMacroInfo(II); - if (MI && MI->isFunctionLike()) { - Diag(R.getNameLoc(), diag::err_undeclared_var_use) << II->getName(); - Diag(MI->getDefinitionLoc(), - diag::note_function_like_macro_requires_parens) - << II->getName(); - return true; - } - } - } - // We didn't find anything, so try to correct for a typo. TypoCorrection Corrected; if (S && (Corrected = @@ -2798,6 +2841,9 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, } R.clear(); + if (isFunctionLikeMacro(Name, SemaRef, R.getNameLoc())) + return true; + // Emit a special diagnostic for failed member lookups. // FIXME: computing the declaration context might fail here (?) if (!SS.isEmpty()) { diff --git a/clang/test/Preprocessor/macro_with_initializer_list.cpp b/clang/test/Preprocessor/macro_with_initializer_list.cpp index cf1d137eadcbe..5f66971622ce7 100644 --- a/clang/test/Preprocessor/macro_with_initializer_list.cpp +++ b/clang/test/Preprocessor/macro_with_initializer_list.cpp @@ -134,7 +134,6 @@ void test_NE() { // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:32-110:32}:")" #define INIT(var, init) Foo var = init; // expected-note 3{{macro 'INIT' defined here}} -// expected-note@-1 2{{'INIT' is defined here as a function-like macro; did you mean 'INIT(...)'}} // Can't use an initializer list as a macro argument. The commas in the list // will be interpretted as argument separaters and adding parenthesis will // make it no longer an initializer list. @@ -160,13 +159,12 @@ void test() { // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}} } -// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{146:11-146:11}:"(" -// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{146:23-146:23}:")" +// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:11-145:11}:"(" +// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:23-145:23}:")" #define M(name,a,b,c,d,e,f,g,h,i,j,k,l) \ Foo name = a + b + c + d + e + f + g + h + i + j + k + l; // expected-note@-2 2{{defined here}} -// expected-note@-3 {{'M' is defined here as a function-like macro; did you mean 'M(...)'}} void test2() { M(F1, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo()); @@ -181,12 +179,4 @@ void test2() { // expected-error@-2 {{too many arguments provided}} // expected-error@-3 {{use of undeclared identifier}} // expected-note@-4 {{cannot use initializer list at the beginning of a macro argument}} -} - -#define LIM() 10 -// expected-note@-1 {{'LIM' is defined here as a function-like macro; did you mean 'LIM(...)'}} - -void test3() { - int iter = LIM; - // expected-error@-1 {{use of undeclared identifier LIM}} } \ No newline at end of file diff --git a/clang/test/Sema/typo-correction.c b/clang/test/Sema/typo-correction.c index 510a67e725f9c..5ffbc512ef73b 100644 --- a/clang/test/Sema/typo-correction.c +++ b/clang/test/Sema/typo-correction.c @@ -118,3 +118,25 @@ void PR40286_3(int the_value) { // expected-note {{'the_value' declared here}} void PR40286_4(int the_value) { // expected-note {{'the_value' declared here}} PR40286_h(the_value, the_value, the_walue); // expected-error {{use of undeclared identifier 'the_walue'; did you mean 'the_value'?}} } + +#define FOO1() 10 +// expected-note@-1 4 {{'FOO1' defined here as a function-like macro}} + +int x = FOO1; // expected-error {{use of undeclared identifier FOO1; did you mean FOO1(...)?}} + +void test3() { + int iter = FOO1; + // expected-error@-1 {{use of undeclared identifier FOO1; did you mean FOO1(...)?}} +} + +void bar(int); + +void test4() { + int FOO; // expected-note {{'FOO' declared here}} + int x = FOO1; // expected-error {{use of undeclared identifier 'FOO1'; did you mean 'FOO'?}} +} + +void test5() { + FOO1 + 1; // expected-error {{use of undeclared identifier FOO1; did you mean FOO1(...)?}} + bar(FOO1); // expected-error {{use of undeclared identifier FOO1; did you mean FOO1(...)?}} +} >From 5bdd6dca50130cf8e0222fd031930cb895f5f448 Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Sun, 9 Feb 2025 14:50:49 +0530 Subject: [PATCH 08/13] [clang][Tests] Enhance diagnostic notes for function-like macros in initializer list tests --- clang/test/Preprocessor/macro_with_initializer_list.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/clang/test/Preprocessor/macro_with_initializer_list.cpp b/clang/test/Preprocessor/macro_with_initializer_list.cpp index 5f66971622ce7..dab60e60b14a1 100644 --- a/clang/test/Preprocessor/macro_with_initializer_list.cpp +++ b/clang/test/Preprocessor/macro_with_initializer_list.cpp @@ -134,6 +134,7 @@ void test_NE() { // CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{110:32-110:32}:")" #define INIT(var, init) Foo var = init; // expected-note 3{{macro 'INIT' defined here}} +// expected-note@-1 2{{'INIT' defined here as a function-like macro}} // Can't use an initializer list as a macro argument. The commas in the list // will be interpretted as argument separaters and adding parenthesis will // make it no longer an initializer list. @@ -159,12 +160,13 @@ void test() { // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}} } -// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:11-145:11}:"(" -// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{145:23-145:23}:")" +// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{146:11-146:11}:"(" +// CHECK: fix-it:"{{.*}}macro_with_initializer_list.cpp":{146:23-146:23}:")" #define M(name,a,b,c,d,e,f,g,h,i,j,k,l) \ Foo name = a + b + c + d + e + f + g + h + i + j + k + l; // expected-note@-2 2{{defined here}} +// expected-note@-3 {{'M' defined here as a function-like macro}} void test2() { M(F1, Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo(), Foo()); @@ -179,4 +181,4 @@ void test2() { // expected-error@-2 {{too many arguments provided}} // expected-error@-3 {{use of undeclared identifier}} // expected-note@-4 {{cannot use initializer list at the beginning of a macro argument}} -} \ No newline at end of file +} >From 65118140ad5b06caec01ff8b578f4d30885f298f Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Sun, 9 Feb 2025 20:28:12 +0530 Subject: [PATCH 09/13] [clang][Docs] Add release note for diagnosing missing parentheses in function-like macros --- clang/docs/ReleaseNotes.rst | 304 ++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 clang/docs/ReleaseNotes.rst diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst new file mode 100644 index 0000000000000..a469e5a97a4ac --- /dev/null +++ b/clang/docs/ReleaseNotes.rst @@ -0,0 +1,304 @@ +=========================================== +Clang |release| |ReleaseNotesTitle| +=========================================== + +.. contents:: + :local: + :depth: 2 + +Written by the `LLVM Team <https://llvm.org/>`_ + +.. only:: PreRelease + + .. warning:: + These are in-progress notes for the upcoming Clang |version| release. + Release notes for previous releases can be found on + `the Releases Page <https://llvm.org/releases/>`_. + +Introduction +============ + +This document contains the release notes for the Clang C/C++/Objective-C +frontend, part of the LLVM Compiler Infrastructure, release |release|. Here we +describe the status of Clang in some detail, including major +improvements from the previous release and new feature work. For the +general LLVM release notes, see `the LLVM +documentation <https://llvm.org/docs/ReleaseNotes.html>`_. For the libc++ release notes, +see `this page <https://libcxx.llvm.org/ReleaseNotes.html>`_. All LLVM releases +may be downloaded from the `LLVM releases web site <https://llvm.org/releases/>`_. + +For more information about Clang or LLVM, including information about the +latest release, please see the `Clang Web Site <https://clang.llvm.org>`_ or the +`LLVM Web Site <https://llvm.org>`_. + +Potentially Breaking Changes +============================ + +- The Objective-C ARC migrator (ARCMigrate) has been removed. + +C/C++ Language Potentially Breaking Changes +------------------------------------------- + +C++ Specific Potentially Breaking Changes +----------------------------------------- + +- The type trait builtin ``__is_referenceable`` has been removed, since it has + very few users and all the type traits that could benefit from it in the + standard library already have their own bespoke builtins. + +ABI Changes in This Version +--------------------------- + +- Return larger CXX records in memory instead of using AVX registers. Code compiled with older clang will be incompatible with newer version of the clang unless -fclang-abi-compat=20 is provided. (#GH120670) + +AST Dumping Potentially Breaking Changes +---------------------------------------- + +Clang Frontend Potentially Breaking Changes +------------------------------------------- + +Clang Python Bindings Potentially Breaking Changes +-------------------------------------------------- + +What's New in Clang |release|? +============================== + +C++ Language Changes +-------------------- + +C++2c Feature Support +^^^^^^^^^^^^^^^^^^^^^ + +C++23 Feature Support +^^^^^^^^^^^^^^^^^^^^^ + +C++20 Feature Support +^^^^^^^^^^^^^^^^^^^^^ + +C++17 Feature Support +^^^^^^^^^^^^^^^^^^^^^ + +Resolutions to C++ Defect Reports +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- The flag `-frelaxed-template-template-args` + and its negation have been removed, having been deprecated since the previous + two releases. The improvements to template template parameter matching implemented + in the previous release, as described in P3310 and P3579, made this flag unnecessary. + +C Language Changes +------------------ + +- Clang now allows an ``inline`` specifier on a typedef declaration of a + function type in Microsoft compatibility mode. #GH124869 + +C2y Feature Support +^^^^^^^^^^^^^^^^^^^ + +C23 Feature Support +^^^^^^^^^^^^^^^^^^^ + +Non-comprehensive list of changes in this release +------------------------------------------------- + +New Compiler Flags +------------------ + +Deprecated Compiler Flags +------------------------- + +Modified Compiler Flags +----------------------- + +Removed Compiler Flags +------------------------- + +Attribute Changes in Clang +-------------------------- + +- The ``no_sanitize`` attribute now accepts both ``gnu`` and ``clang`` names. + +Improvements to Clang's diagnostics +----------------------------------- + +- Improve the diagnostics for deleted default constructor errors for C++ class + initializer lists that don't explicitly list a class member and thus attempt + to implicitly default construct that member. +- The ``-Wunique-object-duplication`` warning has been added to warn about objects + which are supposed to only exist once per program, but may get duplicated when + built into a shared library. +- Fixed a bug where Clang's Analysis did not correctly model the destructor behavior of ``union`` members (#GH119415). +- Clang now provides a diagnostic note for ``function-like macros`` that are missing the required parentheses. + +Improvements to Clang's time-trace +---------------------------------- + +Improvements to Coverage Mapping +-------------------------------- + +Bug Fixes in This Version +------------------------- + +Bug Fixes to Compiler Builtins +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- The behvaiour of ``__add_pointer`` and ``__remove_pointer`` for Objective-C++'s ``id`` and interfaces has been fixed. + +Bug Fixes to Attribute Support +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + - Fixed crash when a parameter to the ``clang::annotate`` attribute evaluates to ``void``. See #GH119125 + +Bug Fixes to C++ Support +^^^^^^^^^^^^^^^^^^^^^^^^ + +- Clang is now better at keeping track of friend function template instance contexts. (#GH55509) +- The initialization kind of elements of structured bindings + direct-list-initialized from an array is corrected to direct-initialization. + +Bug Fixes to AST Handling +^^^^^^^^^^^^^^^^^^^^^^^^^ + +Miscellaneous Bug Fixes +^^^^^^^^^^^^^^^^^^^^^^^ + +- HTML tags in comments that span multiple lines are now parsed correctly by Clang's comment parser. (#GH120843) + +Miscellaneous Clang Crashes Fixed +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +OpenACC Specific Changes +------------------------ + +Target Specific Changes +----------------------- + +AMDGPU Support +^^^^^^^^^^^^^^ + +NVPTX Support +^^^^^^^^^^^^^^ + +Hexagon Support +^^^^^^^^^^^^^^^ + +- The default compilation target has been changed from V60 to V68. + +X86 Support +^^^^^^^^^^^ + +- Disable ``-m[no-]avx10.1`` and switch ``-m[no-]avx10.2`` to alias of 512 bit + options. +- Change ``-mno-avx10.1-512`` to alias of ``-mno-avx10.1-256`` to disable both + 256 and 512 bit instructions. + +Arm and AArch64 Support +^^^^^^^^^^^^^^^^^^^^^^^ + +Android Support +^^^^^^^^^^^^^^^ + +Windows Support +^^^^^^^^^^^^^^^ + +LoongArch Support +^^^^^^^^^^^^^^^^^ + +RISC-V Support +^^^^^^^^^^^^^^ + +CUDA/HIP Language Changes +^^^^^^^^^^^^^^^^^^^^^^^^^ + +CUDA Support +^^^^^^^^^^^^ + +AIX Support +^^^^^^^^^^^ + +NetBSD Support +^^^^^^^^^^^^^^ + +WebAssembly Support +^^^^^^^^^^^^^^^^^^^ + +AVR Support +^^^^^^^^^^^ + +DWARF Support in Clang +---------------------- + +Floating Point Support in Clang +------------------------------- + +Fixed Point Support in Clang +---------------------------- + +AST Matchers +------------ + +clang-format +------------ + +- Adds ``BreakBeforeTemplateCloser`` option. +- Adds ``BinPackLongBracedList`` option to override bin packing options in + long (20 item or more) braced list initializer lists. + +libclang +-------- + +Code Completion +--------------- + +Static Analyzer +--------------- + +New features +^^^^^^^^^^^^ + +A new flag - `-static-libclosure` was introduced to support statically linking +the runtime for the Blocks extension on Windows. This flag currently only +changes the code generation, and even then, only on Windows. This does not +impact the linker behaviour like the other `-static-*` flags. + +Crash and bug fixes +^^^^^^^^^^^^^^^^^^^ + +Improvements +^^^^^^^^^^^^ + +Moved checkers +^^^^^^^^^^^^^^ + +- After lots of improvements, the checker ``alpha.security.ArrayBoundV2`` is + renamed to ``security.ArrayBound``. As this checker is stable now, the old + checker ``alpha.security.ArrayBound`` (which was searching for the same kind + of bugs with an different, simpler and less accurate algorithm) is removed. + +.. _release-notes-sanitizers: + +Sanitizers +---------- + +Python Binding Changes +---------------------- + +OpenMP Support +-------------- +- Added support 'no_openmp_constructs' assumption clause. + +Improvements +^^^^^^^^^^^^ + +Additional Information +====================== + +A wide variety of additional information is available on the `Clang web +page <https://clang.llvm.org/>`_. The web page contains versions of the +API documentation which are up-to-date with the Git version of +the source code. You can access versions of these documents specific to +this release by going into the "``clang/docs/``" directory in the Clang +tree. + +If you have any questions or comments about Clang, please feel free to +contact us on the `Discourse forums (Clang Frontend category) +<https://discourse.llvm.org/c/clang/6>`_. >From 17a50dbfa8b0bfd6aac2aab2f6395e6dc521da61 Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Wed, 12 Feb 2025 09:52:23 +0530 Subject: [PATCH 10/13] [clang][Sema] Improve diagnostics for function-like macros and update related notes --- clang/docs/ReleaseNotes.rst | 5 +++-- .../include/clang/Basic/DiagnosticSemaKinds.td | 4 ++-- clang/lib/Sema/SemaExpr.cpp | 18 +++++++++--------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index a469e5a97a4ac..c37c3d586de7b 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -128,8 +128,9 @@ Improvements to Clang's diagnostics which are supposed to only exist once per program, but may get duplicated when built into a shared library. - Fixed a bug where Clang's Analysis did not correctly model the destructor behavior of ``union`` members (#GH119415). -- Clang now provides a diagnostic note for ``function-like macros`` that are missing the required parentheses. - +- Clang now provides a diagnostic note for function-like macros that are + missing the required parentheses (#GH123038). + Improvements to Clang's time-trace ---------------------------------- diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 739aad0b516a8..96351168bd17e 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11691,8 +11691,8 @@ def err_undeclared_use_suggest : Error< "use of undeclared %0; did you mean %1?">; def err_undeclared_var_use_suggest : Error< "use of undeclared identifier %0; did you mean %1?">; -def err_undeclared_var_use_suggest_func_like_macro - : Error<"use of undeclared identifier %0; did you mean %0(...)?">; +def err_undeclared_var_use_suggest_func_like_macro : Error< + "%0 is defined as an object-like macro; did you mean '%0(...)'?">; def err_no_template : Error<"no template named %0">; def err_no_template_suggest : Error<"no template named %0; did you mean %1?">; def err_no_member_template : Error<"no template named %0 in %1">; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 173094f730723..4821334e510a8 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2548,9 +2548,10 @@ Sema::BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, return E; } -// Check whether a similar function-like macro exists and suggest it -static bool isFunctionLikeMacro(const DeclarationName &Name, Sema &SemaRef, - const SourceLocation &TypoLoc) { +// Diagnose when a macro cannot be expanded because it's a function-like macro +// being used as an object-like macro. Returns true if a diagnostic is emitted. +static bool diagnoseFunctionLikeMacro(Sema &SemaRef, DeclarationName Name, + SourceLocation TypoLoc) { if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { if (II->hasMacroDefinition()) { @@ -2558,7 +2559,7 @@ static bool isFunctionLikeMacro(const DeclarationName &Name, Sema &SemaRef, if (MI && MI->isFunctionLike()) { SemaRef.Diag(TypoLoc, diag::err_undeclared_var_use_suggest_func_like_macro) - << II->getName(); + << II; SemaRef.Diag(MI->getDefinitionLoc(), diag::note_function_like_macro_requires_parens) << II->getName(); @@ -2604,11 +2605,10 @@ static void emitEmptyLookupTypoDiagnostic( if (Ctx) SemaRef.Diag(TypoLoc, diag::err_no_member) << Typo << Ctx << SS.getRange(); - else { - if (isFunctionLikeMacro(Typo, SemaRef, TypoLoc)) - return; + else if (diagnoseFunctionLikeMacro(SemaRef, Typo, TypoLoc)) + return; + else SemaRef.Diag(TypoLoc, DiagnosticID) << Typo; - } return; } @@ -2841,7 +2841,7 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, } R.clear(); - if (isFunctionLikeMacro(Name, SemaRef, R.getNameLoc())) + if (diagnoseFunctionLikeMacro(SemaRef, Name, R.getNameLoc())) return true; // Emit a special diagnostic for failed member lookups. >From 82f09221cce7b010d9759a5074823a07c00b4254 Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Wed, 12 Feb 2025 16:17:08 +0530 Subject: [PATCH 11/13] [clang][Sema] Update diagnostic tests for object-like macros in initializer list tests --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/lib/Sema/SemaExpr.cpp | 2 +- clang/test/Preprocessor/macro_with_initializer_list.cpp | 6 +++--- clang/test/Sema/typo-correction.c | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 96351168bd17e..fb8ccda59e687 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11692,7 +11692,7 @@ def err_undeclared_use_suggest : Error< def err_undeclared_var_use_suggest : Error< "use of undeclared identifier %0; did you mean %1?">; def err_undeclared_var_use_suggest_func_like_macro : Error< - "%0 is defined as an object-like macro; did you mean '%0(...)'?">; + "'%0' is defined as an object-like macro; did you mean '%0(...)'?">; def err_no_template : Error<"no template named %0">; def err_no_template_suggest : Error<"no template named %0; did you mean %1?">; def err_no_member_template : Error<"no template named %0 in %1">; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 4821334e510a8..e3511823fa1da 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -2559,7 +2559,7 @@ static bool diagnoseFunctionLikeMacro(Sema &SemaRef, DeclarationName Name, if (MI && MI->isFunctionLike()) { SemaRef.Diag(TypoLoc, diag::err_undeclared_var_use_suggest_func_like_macro) - << II; + << II ->getName(); SemaRef.Diag(MI->getDefinitionLoc(), diag::note_function_like_macro_requires_parens) << II->getName(); diff --git a/clang/test/Preprocessor/macro_with_initializer_list.cpp b/clang/test/Preprocessor/macro_with_initializer_list.cpp index dab60e60b14a1..d9e653106d4a1 100644 --- a/clang/test/Preprocessor/macro_with_initializer_list.cpp +++ b/clang/test/Preprocessor/macro_with_initializer_list.cpp @@ -150,13 +150,13 @@ void test() { // Can't be fixed by parentheses. INIT(e, {1, 2, 3}); // expected-error@-1 {{too many arguments provided}} - // expected-error@-2 {{use of undeclared identifier}} + // expected-error@-2 {{'INIT' is defined as an object-like macro; did you mean 'INIT(...)'?}} // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}} // Can't be fixed by parentheses. INIT(e, {1, 2, 3} + {1, 2, 3}); // expected-error@-1 {{too many arguments provided}} - // expected-error@-2 {{use of undeclared identifier}} + // expected-error@-2 {{'INIT' is defined as an object-like macro; did you mean 'INIT(...)'?}} // expected-note@-3 {{cannot use initializer list at the beginning of a macro argument}} } @@ -179,6 +179,6 @@ void test2() { M(F3, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}, {1,2,3}); // expected-error@-2 {{too many arguments provided}} - // expected-error@-3 {{use of undeclared identifier}} + // expected-error@-3 {{'M' is defined as an object-like macro; did you mean 'M(...)'?}} // expected-note@-4 {{cannot use initializer list at the beginning of a macro argument}} } diff --git a/clang/test/Sema/typo-correction.c b/clang/test/Sema/typo-correction.c index 5ffbc512ef73b..cc52229078691 100644 --- a/clang/test/Sema/typo-correction.c +++ b/clang/test/Sema/typo-correction.c @@ -122,11 +122,11 @@ void PR40286_4(int the_value) { // expected-note {{'the_value' declared here}} #define FOO1() 10 // expected-note@-1 4 {{'FOO1' defined here as a function-like macro}} -int x = FOO1; // expected-error {{use of undeclared identifier FOO1; did you mean FOO1(...)?}} +int x = FOO1; // expected-error {{'FOO1' is defined as an object-like macro; did you mean 'FOO1(...)'?}} void test3() { int iter = FOO1; - // expected-error@-1 {{use of undeclared identifier FOO1; did you mean FOO1(...)?}} + // expected-error@-1 {{'FOO1' is defined as an object-like macro; did you mean 'FOO1(...)'?}} } void bar(int); @@ -137,6 +137,6 @@ void test4() { } void test5() { - FOO1 + 1; // expected-error {{use of undeclared identifier FOO1; did you mean FOO1(...)?}} - bar(FOO1); // expected-error {{use of undeclared identifier FOO1; did you mean FOO1(...)?}} + FOO1 + 1; // expected-error {{'FOO1' is defined as an object-like macro; did you mean 'FOO1(...)'?}} + bar(FOO1); // expected-error {{'FOO1' is defined as an object-like macro; did you mean 'FOO1'(...)'?}} } >From 9c5eb95cae197b49c663413c36fadd05b2315325 Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Wed, 12 Feb 2025 18:04:00 +0530 Subject: [PATCH 12/13] [clang][test]fix overlooked testcase --- clang/test/Sema/typo-correction.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Sema/typo-correction.c b/clang/test/Sema/typo-correction.c index cc52229078691..65729c60f8825 100644 --- a/clang/test/Sema/typo-correction.c +++ b/clang/test/Sema/typo-correction.c @@ -138,5 +138,5 @@ void test4() { void test5() { FOO1 + 1; // expected-error {{'FOO1' is defined as an object-like macro; did you mean 'FOO1(...)'?}} - bar(FOO1); // expected-error {{'FOO1' is defined as an object-like macro; did you mean 'FOO1'(...)'?}} + bar(FOO1); // expected-error {{'FOO1' is defined as an object-like macro; did you mean 'FOO1(...)'?}} } >From 16120e092168c2fff56e578b6733b00d463b95ef Mon Sep 17 00:00:00 2001 From: Prashanth <[email protected]> Date: Mon, 7 Sep 2026 15:58:26 +0530 Subject: [PATCH 13/13] Update c23-varargs.c test expectations for function-like macro diagnostic --- clang/test/Sema/c23-varargs.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/clang/test/Sema/c23-varargs.c b/clang/test/Sema/c23-varargs.c index 1700d5a429160..9bc72f21358d1 100644 --- a/clang/test/Sema/c23-varargs.c +++ b/clang/test/Sema/c23-varargs.c @@ -26,18 +26,22 @@ void bar(int x, int y, ...) { // follow-on diagnostic that should be silenced. va_list list; va_start(); // pre-c23-error {{too few arguments provided to function-like macro invocation}} \ - pre-c23-error {{use of undeclared identifier 'va_start'}} \ - expected-error{{too few arguments to function call, expected 1, have 0}} + expected-error{{too few arguments to function call, expected 1, have 0}} \ + pre-c23-error{{'va_start' is defined as an object-like macro; did you mean 'va_start(...)'?}} \ + pre-c23-note@__stdarg_va_arg.h:17{{'va_start' defined here as a function-like macro}} va_start(list); // pre-c23-error {{too few arguments provided to function-like macro invocation}} \ - pre-c23-error {{use of undeclared identifier 'va_start'}} + pre-c23-error{{'va_start' is defined as an object-like macro; did you mean 'va_start(...)'?}} \ + pre-c23-note@__stdarg_va_arg.h:17{{'va_start' defined here as a function-like macro}} va_start(list, 0); // both-warning {{second argument to 'va_start' is not the last non-variadic parameter}} va_start(list, x); // both-warning {{second argument to 'va_start' is not the last non-variadic parameter}} va_start(list, y); // ok va_start(list, 0, 1); // pre-c23-error {{too many arguments provided to function-like macro invocation}} \ - pre-c23-error {{use of undeclared identifier 'va_start'}} \ + pre-c23-error{{'va_start' is defined as an object-like macro; did you mean 'va_start(...)'?}} \ + pre-c23-note@__stdarg_va_arg.h:17{{'va_start' defined here as a function-like macro}} \ expected-error {{too many arguments to function call, expected at most 2, have 3}} va_start(list, y, y); // pre-c23-error {{too many arguments provided to function-like macro invocation}} \ - pre-c23-error {{use of undeclared identifier 'va_start'}} \ - expected-error {{too many arguments to function call, expected at most 2, have 3}} + expected-error {{too many arguments to function call, expected at most 2, have 3}} \ + pre-c23-error{{'va_start' is defined as an object-like macro; did you mean 'va_start(...)'?}} \ + pre-c23-note@__stdarg_va_arg.h:17{{'va_start' defined here as a function-like macro}} \ // pre-c23-note@__stdarg_va_arg.h:* 4 {{macro 'va_start' defined here}} } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
