[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added a comment. Created: https://reviews.llvm.org/D52849 Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers abandoned this revision. nickdesaulniers added a comment. Well that didn't do what I wanted...(sorry, still learning arc). Going to abandon this and push a much simpler fix. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 168183. nickdesaulniers added a comment. [SEMA] split ExtWarn dupl-decl-spec's into Extension and ExtWarn For types deduced from typedef's and typeof's, don't warn for duplicate declaration specifiers in C90 unless -pedantic. Create a third diagnostic type for duplicate declaration specifiers. Previously, we had an ExtWarn and a Warning. This change adds a third, Extension, which only warns when -pedantic is set, staying silent otherwise. Fixes PR32985. Repository: rC Clang https://reviews.llvm.org/D52248 Files: include/clang/Basic/DiagnosticSemaKinds.td lib/Parse/ParseDecl.cpp lib/Sema/DeclSpec.cpp test/Sema/pr32985.c Index: test/Sema/pr32985.c === --- /dev/null +++ test/Sema/pr32985.c @@ -0,0 +1,20 @@ +/* +RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 %s -allow-empty +RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +*/ + +typedef const int t; +const t c_i; +/* +CHECK-GNU89-NOT: 7:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 7:1: warning: duplicate 'const' declaration specifier +*/ + +const int c_i2; +const typeof(c_i2) c_i3; +/* +CHECK-GNU89-NOT: 14:7: warning: extension used +CHECK-GNU89-NOT: 14:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 14:7: warning: extension used +CHECK-GNU89-PEDANTIC: 14:1: warning: duplicate 'const' declaration specifier +*/ Index: lib/Sema/DeclSpec.cpp === --- lib/Sema/DeclSpec.cpp +++ lib/Sema/DeclSpec.cpp @@ -438,7 +438,7 @@ if (TNew != TPrev) DiagID = diag::err_invalid_decl_spec_combination; else -DiagID = IsExtension ? diag::ext_duplicate_declspec : +DiagID = IsExtension ? diag::ext_warn_duplicate_declspec : diag::warn_duplicate_declspec; return true; } @@ -967,7 +967,7 @@ unsigned ) { if (isModulePrivateSpecified()) { PrevSpec = "__module_private__"; -DiagID = diag::ext_duplicate_declspec; +DiagID = diag::ext_warn_duplicate_declspec; return true; } Index: lib/Parse/ParseDecl.cpp === --- lib/Parse/ParseDecl.cpp +++ lib/Parse/ParseDecl.cpp @@ -3838,7 +3838,8 @@ assert(PrevSpec && "Method did not return previous specifier!"); assert(DiagID); - if (DiagID == diag::ext_duplicate_declspec) + if (DiagID == diag::ext_duplicate_declspec || + DiagID == diag::ext_warn_duplicate_declspec) Diag(Tok, DiagID) << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation()); else if (DiagID == diag::err_opencl_unknown_type_specifier) { Index: include/clang/Basic/DiagnosticSemaKinds.td === --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -192,7 +192,9 @@ "flexible array initialization is a GNU extension">, InGroup; // Declarations. -def ext_duplicate_declspec : ExtWarn<"duplicate '%0' declaration specifier">, +def ext_duplicate_declspec : Extension<"duplicate '%0' declaration specifier">, + InGroup; +def ext_warn_duplicate_declspec : ExtWarn<"duplicate '%0' declaration specifier">, InGroup; def warn_duplicate_declspec : Warning<"duplicate '%0' declaration specifier">, InGroup; Index: test/Sema/pr32985.c === --- /dev/null +++ test/Sema/pr32985.c @@ -0,0 +1,20 @@ +/* +RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 %s -allow-empty +RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +*/ + +typedef const int t; +const t c_i; +/* +CHECK-GNU89-NOT: 7:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 7:1: warning: duplicate 'const' declaration specifier +*/ + +const int c_i2; +const typeof(c_i2) c_i3; +/* +CHECK-GNU89-NOT: 14:7: warning: extension used +CHECK-GNU89-NOT: 14:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 14:7: warning: extension used +CHECK-GNU89-PEDANTIC: 14:1: warning: duplicate 'const' declaration specifier +*/ Index: lib/Sema/DeclSpec.cpp === --- lib/Sema/DeclSpec.cpp +++ lib/Sema/DeclSpec.cpp @@ -438,7 +438,7 @@ if (TNew != TPrev) DiagID = diag::err_invalid_decl_spec_combination; else -DiagID = IsExtension ? diag::ext_duplicate_declspec : +DiagID = IsExtension ? diag::ext_warn_duplicate_declspec : diag::warn_duplicate_declspec; return true; } @@ -967,7 +967,7 @@ unsigned ) { if (isModulePrivateSpecified())
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added inline comments. Comment at: lib/Sema/DeclSpec.cpp:441-442 else -DiagID = IsExtension ? diag::ext_duplicate_declspec : - diag::warn_duplicate_declspec; +DiagID = IsExtension ? diag::ext_duplicate_declspec + : diag::extwarn_duplicate_declspec; return true; rsmith wrote: > This doesn't look like a correct change. When `IsExtension` is false, the > duplicate is not ill-formed, so we shouldn't use an `ExtWarn` diagnostic > (which results in an error under `-pedantic-errors`). If the duplicate is not ill-formed, then isn't the original code incorrect, since it produces a warning? Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
rsmith added a comment. Downgrading the C89 warning for duplicate qualifiers from typedefs / __typeof from `ExtWarn` to `Extension` seems very reasonable to me. However, I don't see a justification for removing the warning for duplicate explicit (non-typedef) qualifiers in C99, nor for downgrading the corresponding `ExtWarn` to an `Extension` in our other language modes; that seems like a regression. Comment at: include/clang/Basic/DiagnosticSemaKinds.td:197 + InGroup; +def extwarn_duplicate_declspec : ExtWarn<"duplicate '%0' declaration specifier">, InGroup; Please follow our naming convention for diagnostic names: both `Extension` and `ExtWarn` diagnostics should start `ext_`. Comment at: lib/Sema/DeclSpec.cpp:441-442 else -DiagID = IsExtension ? diag::ext_duplicate_declspec : - diag::warn_duplicate_declspec; +DiagID = IsExtension ? diag::ext_duplicate_declspec + : diag::extwarn_duplicate_declspec; return true; This doesn't look like a correct change. When `IsExtension` is false, the duplicate is not ill-formed, so we shouldn't use an `ExtWarn` diagnostic (which results in an error under `-pedantic-errors`). Comment at: lib/Sema/DeclSpec.cpp:854-857 + // Duplicates are permitted in C99 onwards, but are not permitted in C++. In + // C90, they are a warning if -pedantic. We do not need to set the + // qualifier's location since we already have it. + if (TypeQualifiers & T && !Lang.C99) { We still want to warn on duplicate decl specifiers in C99 mode. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 167845. nickdesaulniers marked an inline comment as done. nickdesaulniers added a comment. - move back untouched test case Repository: rC Clang https://reviews.llvm.org/D52248 Files: include/clang/Basic/DiagnosticSemaKinds.td lib/Parse/ParseDecl.cpp lib/Sema/DeclSpec.cpp lib/Sema/SemaType.cpp test/FixIt/fixit-eof-space.c test/Parser/atomic.c test/Sema/declspec.c test/Sema/dupl-declspec.c Index: test/Sema/dupl-declspec.c === --- /dev/null +++ test/Sema/dupl-declspec.c @@ -0,0 +1,242 @@ +/* +RUN: not %clang_cc1 %s -std=c89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89 %s +RUN: not %clang_cc1 %s -std=c89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99 %s +RUN: not %clang_cc1 %s -std=c99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11 %s +RUN: not %clang_cc1 %s -std=c11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17 %s +RUN: not %clang_cc1 %s -std=c17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17-PEDANTIC %s + +RUN: not %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 -allow-empty %s +RUN: not %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17-PEDANTIC %s +*/ + +const const int pr8264_1; +/* +CHECK-C89-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +*/ + +typedef const int t; +const t c_i; +/* +CHECK-C89-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 45:1: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 45:1: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +*/ + +const int c_i2; +const typeof(pr8264_1)
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 167843. nickdesaulniers marked 2 inline comments as done. nickdesaulniers added a comment. - add back test for typedef typedef - add test for dupl _Atomic and restrict Repository: rC Clang https://reviews.llvm.org/D52248 Files: include/clang/Basic/DiagnosticSemaKinds.td lib/Parse/ParseDecl.cpp lib/Sema/DeclSpec.cpp lib/Sema/SemaType.cpp test/FixIt/fixit-eof-space.c test/FixIt/fixit.c test/Parser/atomic.c test/Sema/declspec.c test/Sema/dupl-declspec.c Index: test/Sema/dupl-declspec.c === --- /dev/null +++ test/Sema/dupl-declspec.c @@ -0,0 +1,242 @@ +/* +RUN: not %clang_cc1 %s -std=c89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89 %s +RUN: not %clang_cc1 %s -std=c89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99 %s +RUN: not %clang_cc1 %s -std=c99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11 %s +RUN: not %clang_cc1 %s -std=c11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17 %s +RUN: not %clang_cc1 %s -std=c17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17-PEDANTIC %s + +RUN: not %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 -allow-empty %s +RUN: not %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17-PEDANTIC %s +*/ + +const const int pr8264_1; +/* +CHECK-C89-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +*/ + +typedef const int t; +const t c_i; +/* +CHECK-C89-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 45:1: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 45:1: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 45:1: warning: duplicate 'const'
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers marked an inline comment as done. nickdesaulniers added inline comments. Comment at: test/FixIt/fixit.c:50 -// CHECK: const typedef int int_t; -const typedef typedef int int_t; // expected-warning {{duplicate 'typedef'}} - nickdesaulniers wrote: > Ah, this was a case I should add one last test for. I think reviewers can > still start reviewing the rest. This should just add one additional test > case. Added test case back. Comment at: test/Parser/atomic.c:5 typedef _Atomic int atomic_int; -typedef _Atomic _Atomic _Atomic(int) atomic_int; // expected-warning {{duplicate '_Atomic' declaration specifier}} nickdesaulniers wrote: > Note to reviewers: this deletion was intentional. It is not copied over to > the new test file test/Sema/dupl-declspec.c because we now DONT want to warn > for duplicates in C99+, and `_Atomic` was not available before C11. Actually, we can still test that it does not appear. Comment at: test/Sema/declspec.c:43 -volatile volatile int pr8264_2; // expected-warning {{duplicate 'volatile' declaration specifier}} -char * restrict restrict pr8264_3; // expected-warning {{duplicate 'restrict' declaration specifier}} - nickdesaulniers wrote: > Note to reviewers; this deletion was intentional. It is not copied over to > the new test file test/Sema/dupl-declspec.c with the rest of the PR8264 cases > because we now DONT want to warn for duplicates in C99+, and `restrict` was > not available before then (ie. C90). > > The rest of these cases were moved to the new test file > test/Sema/dupl-declspec.c and exhaustively tested against all current C > standards. Actually, we can still test that it does not appear. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added inline comments. Comment at: test/FixIt/fixit.c:50 -// CHECK: const typedef int int_t; -const typedef typedef int int_t; // expected-warning {{duplicate 'typedef'}} - Ah, this was a case I should add one last test for. I think reviewers can still start reviewing the rest. This should just add one additional test case. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added a comment. Ok, I think this is ready for rereview. Comment at: test/Parser/atomic.c:5 typedef _Atomic int atomic_int; -typedef _Atomic _Atomic _Atomic(int) atomic_int; // expected-warning {{duplicate '_Atomic' declaration specifier}} Note to reviewers: this deletion was intentional. It is not copied over to the new test file test/Sema/dupl-declspec.c because we now DONT want to warn for duplicates in C99+, and `_Atomic` was not available before C11. Comment at: test/Sema/declspec.c:43 -volatile volatile int pr8264_2; // expected-warning {{duplicate 'volatile' declaration specifier}} -char * restrict restrict pr8264_3; // expected-warning {{duplicate 'restrict' declaration specifier}} - Note to reviewers; this deletion was intentional. It is not copied over to the new test file test/Sema/dupl-declspec.c with the rest of the PR8264 cases because we now DONT want to warn for duplicates in C99+, and `restrict` was not available before then (ie. C90). The rest of these cases were moved to the new test file test/Sema/dupl-declspec.c and exhaustively tested against all current C standards. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 167565. nickdesaulniers added a comment. Herald added a subscriber: jfb. - split duplicate_declspec into Extension and Extwarn from Extwarn. - rename ext_duplicate_declspec to be the Extension, not the Extwarn. - Fix C++ case. - Use tablegen'd Extension rather than checking Pedantic diag option. - Update tests that started failing due to this change. - Consolidate checks for duplicate declspecs into 1 file. - Move cases for PR8264 into my added test case, extending them for various language standards. - Update my tests/rename the new test file name. Repository: rC Clang https://reviews.llvm.org/D52248 Files: include/clang/Basic/DiagnosticSemaKinds.td lib/Parse/ParseDecl.cpp lib/Sema/DeclSpec.cpp lib/Sema/SemaType.cpp test/FixIt/fixit-eof-space.c test/FixIt/fixit.c test/Parser/atomic.c test/Sema/declspec.c test/Sema/dupl-declspec.c Index: test/Sema/dupl-declspec.c === --- /dev/null +++ test/Sema/dupl-declspec.c @@ -0,0 +1,198 @@ +/* +RUN: not %clang_cc1 %s -std=c89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89 %s +RUN: not %clang_cc1 %s -std=c89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99 %s +RUN: not %clang_cc1 %s -std=c99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11 %s +RUN: not %clang_cc1 %s -std=c11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17 %s +RUN: not %clang_cc1 %s -std=c17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17-PEDANTIC %s + +RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17 -allow-empty %s +RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17-PEDANTIC %s +*/ + +const const int pr8264_1; +/* +CHECK-C89-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 21:7: warning: duplicate 'const' declaration specifier +*/ + +typedef const int t; +const t c_i; +/* +CHECK-C89-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 45:1: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 45:1: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 45:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 45:1: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 45:1: warning: duplicate 'const' declaration
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
rsmith added a comment. The right way to produce diagnostics under pedantic mode is to model them as Extension or ExtWarn in the .td file, not by checking the Pedantic diagnostic option directly. If this is an intentional GNU extension too, that makes things a bit more complex (one approach would be to have two diagnostics, one for "this is ill-formed" and another for "this is a GNU extension"). Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added a comment. > Should GCC instead warn for the typedef case for -std=c89 (non pedantic), > according to C90 6.5.3? Seems like yes: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80868#c6 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87435 But let's wait a bit to see what the GCC folks say. If the newer bug doesn't get closed, then I need to rework this patch. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added a comment. This now matches GCC AFAICT. My only question is: Should GCC instead warn for the typedef case for -std=c89 (non pedantic), according to C90 6.5.3? Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166743. nickdesaulniers added a comment. - adjust wording in comment Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89-const.c Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,71 @@ +/* +RUN: not %clang_cc1 %s -std=c89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89 %s +RUN: not %clang_cc1 %s -std=c89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99 %s +RUN: not %clang_cc1 %s -std=c99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11 %s +RUN: not %clang_cc1 %s -std=c11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17 %s +RUN: not %clang_cc1 %s -std=c17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17-PEDANTIC %s + +RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 %s +RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99 %s +RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11 %s +RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17 %s +RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17-PEDANTIC %s +*/ + +const const int c_i; +/* +CHECK: 21:7: warning: duplicate 'const' declaration specifier +*/ + +typedef const int t; +const t c_i2; +/* +CHECK-C89-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 27:1: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 27:1: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +*/ + +const int c_i3; +const typeof(c_i) c_i4; +/* +CHECK-C89: 51:19: error: expected function body after function declarator +CHECK-C89-PEDANTIC: 51:19: error: expected function body after function declarator +CHECK-C99: 51:19: error: expected function body after function declarator +CHECK-C99-PEDANTIC: 51:19: error: expected function body after function declarator +CHECK-C11: 51:19: error: expected function body after function declarator +CHECK-C11-PEDANTIC: 51:19: error: expected function body after function declarator +CHECK-C17: 51:19: error: expected function body after function declarator +CHECK-C17-PEDANTIC: 51:19: error: expected function body after function declarator + +CHECK-GNU89-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 51:1: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 51:1: warning: duplicate 'const' declaration specifier +*/ Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,16 @@ // C90 6.5.3
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166742. nickdesaulniers added a comment. - fix typo s/CNU/GNU/g and update NOTEs Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89-const.c Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,71 @@ +/* +RUN: not %clang_cc1 %s -std=c89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89 %s +RUN: not %clang_cc1 %s -std=c89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99 %s +RUN: not %clang_cc1 %s -std=c99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11 %s +RUN: not %clang_cc1 %s -std=c11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17 %s +RUN: not %clang_cc1 %s -std=c17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17-PEDANTIC %s + +RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 %s +RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99 %s +RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11 %s +RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17 %s +RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17-PEDANTIC %s +*/ + +const const int c_i; +/* +CHECK: 21:7: warning: duplicate 'const' declaration specifier +*/ + +typedef const int t; +const t c_i2; +/* +CHECK-C89-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 27:1: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 27:1: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +*/ + +const int c_i3; +const typeof(c_i) c_i4; +/* +CHECK-C89: 51:19: error: expected function body after function declarator +CHECK-C89-PEDANTIC: 51:19: error: expected function body after function declarator +CHECK-C99: 51:19: error: expected function body after function declarator +CHECK-C99-PEDANTIC: 51:19: error: expected function body after function declarator +CHECK-C11: 51:19: error: expected function body after function declarator +CHECK-C11-PEDANTIC: 51:19: error: expected function body after function declarator +CHECK-C17: 51:19: error: expected function body after function declarator +CHECK-C17-PEDANTIC: 51:19: error: expected function body after function declarator + +CHECK-GNU89-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 51:1: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 51:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 51:1: warning: duplicate 'const' declaration specifier +*/ Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,16 @@ // C90
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added inline comments. Comment at: test/Sema/gnu89-const.c:41-46 +CHECK-CNU99-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU99-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU11-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU11-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU17-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU17-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier gah, `CNU` typo! Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166740. nickdesaulniers added a comment. - condense CHECK-prefixes into CHECK for const const Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89-const.c Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,71 @@ +/* +RUN: not %clang_cc1 %s -std=c89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89 %s +RUN: not %clang_cc1 %s -std=c89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99 %s +RUN: not %clang_cc1 %s -std=c99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11 %s +RUN: not %clang_cc1 %s -std=c11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17 %s +RUN: not %clang_cc1 %s -std=c17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17-PEDANTIC %s + +RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 %s +RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99 %s +RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11 %s +RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17 %s +RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17-PEDANTIC %s +*/ + +const const int c_i; +/* +CHECK: 21:7: warning: duplicate 'const' declaration specifier +*/ + +typedef const int t; +const t c_i2; +/* +CHECK-C89-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 27:1: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU89-PEDANTIC: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU99-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU99-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU11-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU11-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU17-NOT: 27:1: warning: duplicate 'const' declaration specifier +CHECK-CNU17-PEDANTIC-NOT: 27:1: warning: duplicate 'const' declaration specifier +*/ + +const int c_i3; +const typeof(c_i) c_i4; +/* +CHECK-C89: 50:19: error: expected function body after function declarator +CHECK-C89-PEDANTIC: 50:19: error: expected function body after function declarator +CHECK-C99: 50:19: error: expected function body after function declarator +CHECK-C99-PEDANTIC: 50:19: error: expected function body after function declarator +CHECK-C11: 50:19: error: expected function body after function declarator +CHECK-C11-PEDANTIC: 50:19: error: expected function body after function declarator +CHECK-C17: 50:19: error: expected function body after function declarator +CHECK-C17-PEDANTIC: 50:19: error: expected function body after function declarator + +CHECK-GNU89-NOT: 50:1: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU89-PEDANTIC: 50:1: warning: duplicate 'const' declaration specifier +^ NOTE: special case +CHECK-GNU99-NOT: 50:1: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC-NOT: 50:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-NOT: 50:1: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC-NOT: 50:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-NOT: 50:1: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC-NOT: 50:1: warning: duplicate 'const' declaration specifier +*/ Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,16 @@
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166736. nickdesaulniers added a comment. - add ISO C tests, handle typedef case new tests found Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89-const.c Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,87 @@ +/* +RUN: not %clang_cc1 %s -std=c89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89 %s +RUN: not %clang_cc1 %s -std=c89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99 %s +RUN: not %clang_cc1 %s -std=c99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11 %s +RUN: not %clang_cc1 %s -std=c11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17 %s +RUN: not %clang_cc1 %s -std=c17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17-PEDANTIC %s + +RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 %s +RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99 %s +RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11 %s +RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17 %s +RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17-PEDANTIC %s +*/ + +const const int c_i; +/* +CHECK-C89: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C99: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier + +CHECK-GNU89: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU99: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +*/ + +typedef const int t; +const t c_i2; +/* +CHECK-C89-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 43:1: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU89-PEDANTIC: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU99-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU99-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU11-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU11-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU17-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU17-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +*/ + +const int c_i3; +const typeof(c_i) c_i4; +/* +CHECK-C89: 66:19: error: expected function body after function declarator +CHECK-C89-PEDANTIC: 66:19: error: expected function body after function declarator +CHECK-C99: 66:19: error: expected function body after function declarator +CHECK-C99-PEDANTIC: 66:19: error: expected function body after function declarator +CHECK-C11: 66:19: error: expected function body after function declarator +CHECK-C11-PEDANTIC: 66:19:
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166737. nickdesaulniers added a comment. - remove debug statments Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89-const.c Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,87 @@ +/* +RUN: not %clang_cc1 %s -std=c89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89 %s +RUN: not %clang_cc1 %s -std=c89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C89-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99 %s +RUN: not %clang_cc1 %s -std=c99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C99-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11 %s +RUN: not %clang_cc1 %s -std=c11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C11-PEDANTIC %s +RUN: not %clang_cc1 %s -std=c17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17 %s +RUN: not %clang_cc1 %s -std=c17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-C17-PEDANTIC %s + +RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89 %s +RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99 %s +RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU99-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11 %s +RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU11-PEDANTIC %s +RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17 %s +RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU17-PEDANTIC %s +*/ + +const const int c_i; +/* +CHECK-C89: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C99: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17: 21:7: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier + +CHECK-GNU89: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU89-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU99: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU99-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU11-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17: 21:7: warning: duplicate 'const' declaration specifier +CHECK-GNU17-PEDANTIC: 21:7: warning: duplicate 'const' declaration specifier +*/ + +typedef const int t; +const t c_i2; +/* +CHECK-C89-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C89-PEDANTIC: 43:1: warning: duplicate 'const' declaration specifier + ^ NOTE: special case +CHECK-C99-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C99-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C11-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C11-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C17-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-C17-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier + +CHECK-GNU89-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU89-PEDANTIC: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU99-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU99-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU11-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU11-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU17-NOT: 43:1: warning: duplicate 'const' declaration specifier +CHECK-CNU17-PEDANTIC-NOT: 43:1: warning: duplicate 'const' declaration specifier +*/ + +const int c_i3; +const typeof(c_i) c_i4; +/* +CHECK-C89: 66:19: error: expected function body after function declarator +CHECK-C89-PEDANTIC: 66:19: error: expected function body after function declarator +CHECK-C99: 66:19: error: expected function body after function declarator +CHECK-C99-PEDANTIC: 66:19: error: expected function body after function declarator +CHECK-C11: 66:19: error: expected function body after function declarator +CHECK-C11-PEDANTIC: 66:19: error: expected function body
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added inline comments. Comment at: test/Sema/gnu89.c:1-2 -// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only -verify +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck %s nickdesaulniers wrote: > nickdesaulniers wrote: > > lebedev.ri wrote: > > > This ideally needs positive tests. E.g.: > > > * `-std=c89` > > > * `-std=c89 -pedantic` > > > * `-std=gnu99` > > > * `-std=gnu99 -pedantic` > > > * `-std=c99` > > > * `-std=c99 -pedantic` > > > > > Since `typeof` is a gnu extension, its use constitutes an error for all non > > gnu C standards, so it's moot to check for duplicate const specifiers from > > typeof exprs. > > > > Since we're trying to match GCC's behavior here, GCC does not warn for > > `-std=gnu99` or `-std=gnu99 -pedantic` so I will add those test cases. > https://godbolt.org/z/3trZdl Ah, I can still put CHECKs for errors. Will add additional tests. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added inline comments. Comment at: lib/Sema/SemaType.cpp:1682 // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { srhines wrote: > This is broken for C11 and C17 (even before you touch anything). As we just > talked about, let's have a helper function to detect the oldest version (and > maybe even that should get promoted as a LANGOPT). From the declarations in `include/clang/Frontend/LangStandards.def`, newer versions of C bitwise OR together flags of previous versions. So C99 sets C99 flag, C11 sets C99 and C11 flags, and C17 sets C99, C11, and C17 flags. So this should be correct (though even to me, this looks wrong on first glance). Thanks to @george.burgess.iv and you for help in looking into this. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166578. nickdesaulniers marked an inline comment as done. nickdesaulniers added a comment. - also run test on gnu99+ Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89-const.c Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89, unless -pedantic was specified. Do not warn in gnu99+, even +// with -pedantic. +const int c_i; +const typeof(c_i) c_i2; +// CHECK-GNU89-PEDANTIC: 14:7: warning: extension used +// CHECK-GNU89-PEDANTIC: 14:1: warning: duplicate 'const' declaration specifier +// CHECK-ABSTRUSE-NOT: 14:1: warning: duplicate 'const' declaration specifier + +const const int c_i3; +// CHECK: 19:7: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t c_i4; +// CHECK: 23:1: warning: duplicate 'const' declaration specifier Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,13 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +// +// Not checked for gnu89 if the TST is from a typeof expression and +// -pedantic was not set. +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && +!(S.getLangOpts().GNUMode && !S.Diags.getDiagnosticOptions().Pedantic && + DS.getTypeSpecType() == DeclSpec::TST_typeofExpr)) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-GNU89-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu99 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu99 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu11 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu11 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu17 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s +// RUN: %clang_cc1 %s -std=gnu17 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89, unless -pedantic was specified. Do not warn in gnu99+, even +// with -pedantic. +const int c_i; +const typeof(c_i) c_i2; +// CHECK-GNU89-PEDANTIC: 14:7: warning: extension used +// CHECK-GNU89-PEDANTIC: 14:1: warning: duplicate 'const' declaration specifier +// CHECK-ABSTRUSE-NOT: 14:1: warning: duplicate 'const' declaration specifier + +const const int c_i3; +// CHECK: 19:7: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t c_i4; +// CHECK: 23:1: warning: duplicate 'const' declaration specifier Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,13 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals &
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166351. nickdesaulniers added a comment. - warn only if -pedantic, add gcc bug test cases Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89.c Index: test/Sema/gnu89.c === --- test/Sema/gnu89.c +++ test/Sema/gnu89.c @@ -1,5 +1,24 @@ -// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only -verify +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck %s int f(int restrict); -void main() {} // expected-warning {{return type of 'main' is not 'int'}} expected-note {{change return type to 'int'}} +void main() {} +// CHECK: return type of 'main' is not 'int' +// CHECK: change return type to 'int' + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i3; +// CHECK-PEDANTIC: warning: extension used +// CHECK-PEDANTIC: warning: duplicate 'const' declaration specifier +// CHECK-otherwise-NOT: warning: duplicate 'const' declaration specifier + +const const int x; +// CHECK: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t x2; +// CHECK: warning: duplicate 'const' declaration specifier + Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,14 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +// +// Not checked for gnu89 if the TST is from a typeof expression and +// -pedantic was not set. +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && +!(S.getLangOpts().GNUMode && +!S.Diags.getDiagnosticOptions().Pedantic && +DS.getTypeSpecType() == DeclSpec::TST_typeofExpr)) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; Index: test/Sema/gnu89.c === --- test/Sema/gnu89.c +++ test/Sema/gnu89.c @@ -1,5 +1,24 @@ -// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only -verify +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck %s int f(int restrict); -void main() {} // expected-warning {{return type of 'main' is not 'int'}} expected-note {{change return type to 'int'}} +void main() {} +// CHECK: return type of 'main' is not 'int' +// CHECK: change return type to 'int' + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i3; +// CHECK-PEDANTIC: warning: extension used +// CHECK-PEDANTIC: warning: duplicate 'const' declaration specifier +// CHECK-otherwise-NOT: warning: duplicate 'const' declaration specifier + +const const int x; +// CHECK: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t x2; +// CHECK: warning: duplicate 'const' declaration specifier + Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,14 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +// +// Not checked for gnu89 if the TST is from a typeof expression and +// -pedantic was not set. +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && +!(S.getLangOpts().GNUMode && +!S.Diags.getDiagnosticOptions().Pedantic && +DS.getTypeSpecType() == DeclSpec::TST_typeofExpr)) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added inline comments. Comment at: test/Sema/gnu89.c:1-2 -// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only -verify +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck %s lebedev.ri wrote: > This ideally needs positive tests. E.g.: > * `-std=c89` > * `-std=c89 -pedantic` > * `-std=gnu99` > * `-std=gnu99 -pedantic` > * `-std=c99` > * `-std=c99 -pedantic` > Since `typeof` is a gnu extension, its use constitutes an error for all non gnu C standards, so it's moot to check for duplicate const specifiers from typeof exprs. Since we're trying to match GCC's behavior here, GCC does not warn for `-std=gnu99` or `-std=gnu99 -pedantic` so I will add those test cases. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers added inline comments. Comment at: test/Sema/gnu89.c:1-2 -// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only -verify +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck %s nickdesaulniers wrote: > lebedev.ri wrote: > > This ideally needs positive tests. E.g.: > > * `-std=c89` > > * `-std=c89 -pedantic` > > * `-std=gnu99` > > * `-std=gnu99 -pedantic` > > * `-std=c99` > > * `-std=c99 -pedantic` > > > Since `typeof` is a gnu extension, its use constitutes an error for all non > gnu C standards, so it's moot to check for duplicate const specifiers from > typeof exprs. > > Since we're trying to match GCC's behavior here, GCC does not warn for > `-std=gnu99` or `-std=gnu99 -pedantic` so I will add those test cases. https://godbolt.org/z/3trZdl Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
srhines added inline comments. Comment at: lib/Sema/SemaType.cpp:1682 // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { This is broken for C11 and C17 (even before you touch anything). As we just talked about, let's have a helper function to detect the oldest version (and maybe even that should get promoted as a LANGOPT). Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166357. nickdesaulniers added a comment. - add line numbers to match specific warning lines Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89-const.c Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i2; +// CHECK-PEDANTIC: 7:7: warning: extension used +// CHECK-PEDANTIC: 7:1: warning: duplicate 'const' declaration specifier +// CHECK-ABSTRUSE-NOT: 7:1: warning: duplicate 'const' declaration specifier + +const const int c_i3; +// CHECK: 12:7: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t c_i4; +// CHECK: 16:1: warning: duplicate 'const' declaration specifier Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,13 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +// +// Not checked for gnu89 if the TST is from a typeof expression and +// -pedantic was not set. +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && +!(S.getLangOpts().GNUMode && !S.Diags.getDiagnosticOptions().Pedantic && + DS.getTypeSpecType() == DeclSpec::TST_typeofExpr)) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i2; +// CHECK-PEDANTIC: 7:7: warning: extension used +// CHECK-PEDANTIC: 7:1: warning: duplicate 'const' declaration specifier +// CHECK-ABSTRUSE-NOT: 7:1: warning: duplicate 'const' declaration specifier + +const const int c_i3; +// CHECK: 12:7: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t c_i4; +// CHECK: 16:1: warning: duplicate 'const' declaration specifier Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,13 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +// +// Not checked for gnu89 if the TST is from a typeof expression and +// -pedantic was not set. +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && +!(S.getLangOpts().GNUMode && !S.Diags.getDiagnosticOptions().Pedantic && + DS.getTypeSpecType() == DeclSpec::TST_typeofExpr)) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166355. nickdesaulniers added a comment. - move test to new file, use check-prefix for both cases Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89-const.c Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i2; +// CHECK-PEDANTIC: warning: extension used +// CHECK-PEDANTIC: warning: duplicate 'const' declaration specifier +// CHECK-ABSTRUSE-NOT: warning: duplicate 'const' declaration specifier + +const const int c_i3; +// CHECK: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t c_i4; +// CHECK: warning: duplicate 'const' declaration specifier Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,13 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +// +// Not checked for gnu89 if the TST is from a typeof expression and +// -pedantic was not set. +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && +!(S.getLangOpts().GNUMode && !S.Diags.getDiagnosticOptions().Pedantic && + DS.getTypeSpecType() == DeclSpec::TST_typeofExpr)) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; Index: test/Sema/gnu89-const.c === --- /dev/null +++ test/Sema/gnu89-const.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-ABSTRUSE %s + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i2; +// CHECK-PEDANTIC: warning: extension used +// CHECK-PEDANTIC: warning: duplicate 'const' declaration specifier +// CHECK-ABSTRUSE-NOT: warning: duplicate 'const' declaration specifier + +const const int c_i3; +// CHECK: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t c_i4; +// CHECK: warning: duplicate 'const' declaration specifier Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,13 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +// +// Not checked for gnu89 if the TST is from a typeof expression and +// -pedantic was not set. +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && +!(S.getLangOpts().GNUMode && !S.Diags.getDiagnosticOptions().Pedantic && + DS.getTypeSpecType() == DeclSpec::TST_typeofExpr)) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
lebedev.ri added inline comments. Comment at: test/Sema/gnu89.c:1-2 -// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only -verify +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck %s This ideally needs positive tests. E.g.: * `-std=c89` * `-std=c89 -pedantic` * `-std=gnu99` * `-std=gnu99 -pedantic` * `-std=c99` * `-std=c99 -pedantic` Comment at: test/Sema/gnu89.c:16 +// CHECK-PEDANTIC: warning: duplicate 'const' declaration specifier +// CHECK-otherwise-NOT: warning: duplicate 'const' declaration specifier + There is no `otherwise` check prefix in the run lines. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
manojgupta added a comment. lgtm. But someone more familiar with these code paths should approve. Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166352. nickdesaulniers added a comment. - git-clang-format HEAD~ Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89.c Index: test/Sema/gnu89.c === --- test/Sema/gnu89.c +++ test/Sema/gnu89.c @@ -1,5 +1,23 @@ -// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only -verify +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck %s int f(int restrict); -void main() {} // expected-warning {{return type of 'main' is not 'int'}} expected-note {{change return type to 'int'}} +void main() {} +// CHECK: return type of 'main' is not 'int' +// CHECK: change return type to 'int' + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i3; +// CHECK-PEDANTIC: warning: extension used +// CHECK-PEDANTIC: warning: duplicate 'const' declaration specifier +// CHECK-otherwise-NOT: warning: duplicate 'const' declaration specifier + +const const int x; +// CHECK: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t x2; +// CHECK: warning: duplicate 'const' declaration specifier Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,13 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +// +// Not checked for gnu89 if the TST is from a typeof expression and +// -pedantic was not set. +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && +!(S.getLangOpts().GNUMode && !S.Diags.getDiagnosticOptions().Pedantic && + DS.getTypeSpecType() == DeclSpec::TST_typeofExpr)) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; Index: test/Sema/gnu89.c === --- test/Sema/gnu89.c +++ test/Sema/gnu89.c @@ -1,5 +1,23 @@ -// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only -verify +// RUN: %clang_cc1 %s -std=gnu89 -pedantic -fsyntax-only 2>&1 | FileCheck -check-prefix=CHECK-PEDANTIC %s +// RUN: %clang_cc1 %s -std=gnu89 -fsyntax-only 2>&1 | FileCheck %s int f(int restrict); -void main() {} // expected-warning {{return type of 'main' is not 'int'}} expected-note {{change return type to 'int'}} +void main() {} +// CHECK: return type of 'main' is not 'int' +// CHECK: change return type to 'int' + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i3; +// CHECK-PEDANTIC: warning: extension used +// CHECK-PEDANTIC: warning: duplicate 'const' declaration specifier +// CHECK-otherwise-NOT: warning: duplicate 'const' declaration specifier + +const const int x; +// CHECK: warning: duplicate 'const' declaration specifier + +typedef const int t; +const t x2; +// CHECK: warning: duplicate 'const' declaration specifier Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,13 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +// +// Not checked for gnu89 if the TST is from a typeof expression and +// -pedantic was not set. +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && +!(S.getLangOpts().GNUMode && !S.Diags.getDiagnosticOptions().Pedantic && + DS.getTypeSpecType() == DeclSpec::TST_typeofExpr)) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
manojgupta added a comment. As per https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80868, I thought GCC also emits this error but only with -pedantic. So probably should keep this error but under -Wextra or another appropriate group? Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
joel added a comment. I built Linux using this patch applied to trunk and it worked for me. Thanks! Repository: rC Clang https://reviews.llvm.org/D52248 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers updated this revision to Diff 166035. nickdesaulniers added a comment. git-clang-format HEAD~ Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89.c Index: test/Sema/gnu89.c === --- test/Sema/gnu89.c +++ test/Sema/gnu89.c @@ -3,3 +3,8 @@ int f(int restrict); void main() {} // expected-warning {{return type of 'main' is not 'int'}} expected-note {{change return type to 'int'}} + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i3; // expected-warning {{extension used}} Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,9 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && !S.getLangOpts().GNUMode && +DS.getTypeSpecType() != DeclSpec::TST_typeofExpr) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; Index: test/Sema/gnu89.c === --- test/Sema/gnu89.c +++ test/Sema/gnu89.c @@ -3,3 +3,8 @@ int f(int restrict); void main() {} // expected-warning {{return type of 'main' is not 'int'}} expected-note {{change return type to 'int'}} + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i3; // expected-warning {{extension used}} Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1679,8 +1679,9 @@ // C90 6.5.3 constraints: "The same type qualifier shall not appear more // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." -if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus && +TypeQuals & Result.getCVRQualifiers() && !S.getLangOpts().GNUMode && +DS.getTypeSpecType() != DeclSpec::TST_typeofExpr) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52248: [SEMA] ignore duplicate declaration specifiers from typeof exprs
nickdesaulniers created this revision. nickdesaulniers added reviewers: srhines, gbiv. Herald added a reviewer: george.burgess.iv. Herald added a subscriber: cfe-commits. nickdesaulniers removed a reviewer: gbiv. Fixes PR32985. Repository: rC Clang https://reviews.llvm.org/D52248 Files: lib/Sema/SemaType.cpp test/Sema/gnu89.c Index: test/Sema/gnu89.c === --- test/Sema/gnu89.c +++ test/Sema/gnu89.c @@ -3,3 +3,8 @@ int f(int restrict); void main() {} // expected-warning {{return type of 'main' is not 'int'}} expected-note {{change return type to 'int'}} + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i3; // expected-warning {{extension used}} Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1680,7 +1680,9 @@ // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +&& TypeQuals & Result.getCVRQualifiers() && +!S.getLangOpts().GNUMode && +DS.getTypeSpecType() != DeclSpec::TST_typeofExpr) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; Index: test/Sema/gnu89.c === --- test/Sema/gnu89.c +++ test/Sema/gnu89.c @@ -3,3 +3,8 @@ int f(int restrict); void main() {} // expected-warning {{return type of 'main' is not 'int'}} expected-note {{change return type to 'int'}} + +// Do not warn about duplicate const declaration specifier as the result of +// typeof in gnu89. +const int c_i; +const typeof(c_i) c_i3; // expected-warning {{extension used}} Index: lib/Sema/SemaType.cpp === --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1680,7 +1680,9 @@ // than once in the same specifier-list or qualifier-list, either directly // or via one or more typedefs." if (!S.getLangOpts().C99 && !S.getLangOpts().CPlusPlus -&& TypeQuals & Result.getCVRQualifiers()) { +&& TypeQuals & Result.getCVRQualifiers() && +!S.getLangOpts().GNUMode && +DS.getTypeSpecType() != DeclSpec::TST_typeofExpr) { if (TypeQuals & DeclSpec::TQ_const && Result.isConstQualified()) { S.Diag(DS.getConstSpecLoc(), diag::ext_duplicate_declspec) << "const"; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits