diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-08-26 14:27:30 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-08-26 14:27:30 +0000 |
commit | 66a985d16ee1c65a43f27bb56f2e8859c8f5110c (patch) | |
tree | 7f7af57d29015c5bd0d6b4358b26c42a027f38ce /clang | |
parent | c4581eaca8434500e32f19af3ffd4b0fdd111e36 (diff) | |
download | bcm5719-llvm-66a985d16ee1c65a43f27bb56f2e8859c8f5110c.tar.gz bcm5719-llvm-66a985d16ee1c65a43f27bb56f2e8859c8f5110c.zip |
Fix bug in __extension__ handling for declarations, from Abramo
Bagnara with a fix from Enea Zaffanella!
llvm-svn: 80094
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/Diagnostic.h | 1 | ||||
-rw-r--r-- | clang/include/clang/Parse/DeclSpec.h | 8 | ||||
-rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 17 | ||||
-rw-r--r-- | clang/test/Sema/implicit-int.c | 2 |
4 files changed, 23 insertions, 5 deletions
diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h index 8a09fa59ab1..226cbe893cb 100644 --- a/clang/include/clang/Basic/Diagnostic.h +++ b/clang/include/clang/Basic/Diagnostic.h @@ -256,6 +256,7 @@ public: /// entirely silenced, no matter how they are mapped. void IncrementAllExtensionsSilenced() { ++AllExtensionsSilenced; } void DecrementAllExtensionsSilenced() { --AllExtensionsSilenced; } + bool hasAllExtensionsSilenced() { return AllExtensionsSilenced != 0; } /// setDiagnosticMapping - This allows the client to specify that certain /// warnings are ignored. Notes can never be mapped, errors can only be diff --git a/clang/include/clang/Parse/DeclSpec.h b/clang/include/clang/Parse/DeclSpec.h index 06d05f7bc71..9d8a6f07988 100644 --- a/clang/include/clang/Parse/DeclSpec.h +++ b/clang/include/clang/Parse/DeclSpec.h @@ -853,6 +853,9 @@ private: DeclaratorChunk::ParamInfo InlineParams[16]; bool InlineParamsUsed; + /// Extension - true if the declaration is preceded by __extension__. + bool Extension : 1; + friend struct DeclaratorChunk; public: @@ -861,7 +864,7 @@ public: Kind(DK_Abstract), InvalidType(DS.getTypeSpecType() == DeclSpec::TST_error), GroupingParens(false), AttrList(0), AsmLabel(0), Type(0), - InlineParamsUsed(false) { + InlineParamsUsed(false), Extension(false) { } ~Declarator() { @@ -1090,6 +1093,9 @@ public: void setAsmLabel(ActionBase::ExprTy *E) { AsmLabel = E; } ActionBase::ExprTy *getAsmLabel() const { return AsmLabel; } + void setExtension(bool Val = true) { Extension = Val; } + bool getExtension() const { return Extension; } + ActionBase::TypeTy *getDeclaratorIdType() const { return Type; } OverloadedOperatorKind getOverloadedOperator() const { return OperatorKind; } diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 8cb8ffdd054..c29f601f299 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -1509,10 +1509,19 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc, // Convert them all to fields. for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) { FieldDeclarator &FD = FieldDeclarators[i]; + DeclPtrTy Field; // Install the declarator into the current TagDecl. - DeclPtrTy Field = Actions.ActOnField(CurScope, TagDecl, - DS.getSourceRange().getBegin(), - FD.D, FD.BitfieldSize); + if (FD.D.getExtension()) { + // Silences extension warnings + ExtensionRAIIObject O(Diags); + Field = Actions.ActOnField(CurScope, TagDecl, + DS.getSourceRange().getBegin(), + FD.D, FD.BitfieldSize); + } else { + Field = Actions.ActOnField(CurScope, TagDecl, + DS.getSourceRange().getBegin(), + FD.D, FD.BitfieldSize); + } FieldDecls.push_back(Field); } } else { // Handle @defs @@ -2016,6 +2025,8 @@ void Parser::ParseDeclarator(Declarator &D) { void Parser::ParseDeclaratorInternal(Declarator &D, DirectDeclParseFunction DirectDeclParser) { + if (Diags.hasAllExtensionsSilenced()) + D.setExtension(); // C++ member pointers start with a '::' or a nested-name. // Member pointers get special handling, since there's no place for the // scope spec in the generic path below. diff --git a/clang/test/Sema/implicit-int.c b/clang/test/Sema/implicit-int.c index 9eab953b3fc..1a81cc55b58 100644 --- a/clang/test/Sema/implicit-int.c +++ b/clang/test/Sema/implicit-int.c @@ -24,7 +24,7 @@ h19_insline(n) // expected-warning {{parameter 'n' was not declared, defaulting } struct foo { - __extension__ __attribute__((packed)) x : 4; // expected-warning {{type specifier missing, defaults to 'int'}} + __extension__ __attribute__((packed)) x : 4; }; |