diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-11-16 18:18:13 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-11-16 18:18:13 +0000 |
| commit | 20ee5ae8710ad38cfae9477bb401362b1f3f22c5 (patch) | |
| tree | 93b9408158ba8f43504e422233ee27005b704e2f | |
| parent | d6b675541406727e6205ff698f922c36b69cc5a1 (diff) | |
| download | bcm5719-llvm-20ee5ae8710ad38cfae9477bb401362b1f3f22c5.tar.gz bcm5719-llvm-20ee5ae8710ad38cfae9477bb401362b1f3f22c5.zip | |
Emit a specific diagnostic when typedefing C++ bool, mirroring gcc.
Fixes rdar://8365458
llvm-svn: 119359
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticParseKinds.td | 2 | ||||
| -rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 12 | ||||
| -rw-r--r-- | clang/test/Parser/cxx-decl.cpp | 3 |
3 files changed, 15 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index bff6a38bcb7..ee0c5b32667 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -208,6 +208,8 @@ def err_expected_ident_in_using : Error< "expected an identifier in using directive">; def err_unexected_colon_in_nested_name_spec : Error< "unexpected ':' in nested name specifier">; +def err_bool_redeclaration : Error< + "redeclaration of C++ built-in type 'bool'">; /// Objective-C parser diagnostics def err_expected_minus_or_plus : Error< diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 00788b0673b..ed58a92323d 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -1348,8 +1348,16 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, break; case tok::kw_bool: case tok::kw__Bool: - isInvalid = DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec, - DiagID); + if (Tok.is(tok::kw_bool) && + DS.getTypeSpecType() != DeclSpec::TST_unspecified && + DS.getStorageClassSpec() == DeclSpec::SCS_typedef) { + PrevSpec = ""; // Not used by the diagnostic. + DiagID = diag::err_bool_redeclaration; + isInvalid = true; + } else { + isInvalid = DS.SetTypeSpecType(DeclSpec::TST_bool, Loc, PrevSpec, + DiagID); + } break; case tok::kw__Decimal32: isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal32, Loc, PrevSpec, diff --git a/clang/test/Parser/cxx-decl.cpp b/clang/test/Parser/cxx-decl.cpp index 6b355e814a8..6d720d36a25 100644 --- a/clang/test/Parser/cxx-decl.cpp +++ b/clang/test/Parser/cxx-decl.cpp @@ -6,6 +6,9 @@ struct Type { int Type; }; +// rdar://8365458 +typedef char bool; // expected-error {{redeclaration of C++ built-in type 'bool'}} \ + // expected-warning {{declaration does not declare anything}} // PR4451 - We should recover well from the typo of '::' as ':' in a2. namespace y { |

