diff options
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 4 | ||||
| -rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/Sema/DeclSpec.cpp | 4 | ||||
| -rw-r--r-- | clang/test/Sema/pr32985.c | 20 |
4 files changed, 27 insertions, 4 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 85450d7f397..2bab1ec322b 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -192,7 +192,9 @@ def ext_flexible_array_init : Extension< "flexible array initialization is a GNU extension">, InGroup<GNUFlexibleArrayInitializer>; // Declarations. -def ext_duplicate_declspec : ExtWarn<"duplicate '%0' declaration specifier">, +def ext_duplicate_declspec : Extension<"duplicate '%0' declaration specifier">, + InGroup<DuplicateDeclSpecifier>; +def ext_warn_duplicate_declspec : ExtWarn<"duplicate '%0' declaration specifier">, InGroup<DuplicateDeclSpecifier>; def warn_duplicate_declspec : Warning<"duplicate '%0' declaration specifier">, InGroup<DuplicateDeclSpecifier>; diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index bbcc860bc2f..643ddfac297 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -3838,7 +3838,8 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, 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) { diff --git a/clang/lib/Sema/DeclSpec.cpp b/clang/lib/Sema/DeclSpec.cpp index b22eea2b364..ea8c4ec40d8 100644 --- a/clang/lib/Sema/DeclSpec.cpp +++ b/clang/lib/Sema/DeclSpec.cpp @@ -438,7 +438,7 @@ template <class T> static bool BadSpecifier(T TNew, T TPrev, 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 @@ bool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID) { if (isModulePrivateSpecified()) { PrevSpec = "__module_private__"; - DiagID = diag::ext_duplicate_declspec; + DiagID = diag::ext_warn_duplicate_declspec; return true; } diff --git a/clang/test/Sema/pr32985.c b/clang/test/Sema/pr32985.c new file mode 100644 index 00000000000..f61cea4e731 --- /dev/null +++ b/clang/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 +*/ |

