Fix bug in __extension__ handling for declarations, from Abramo

Bagnara with a fix from Enea Zaffanella!

llvm-svn: 80094
This commit is contained in:
Douglas Gregor 2009-08-26 14:27:30 +00:00
parent c4581eaca8
commit 66a985d16e
4 changed files with 23 additions and 5 deletions

View File

@ -256,6 +256,7 @@ public:
/// entirely silenced, no matter how they are mapped. /// entirely silenced, no matter how they are mapped.
void IncrementAllExtensionsSilenced() { ++AllExtensionsSilenced; } void IncrementAllExtensionsSilenced() { ++AllExtensionsSilenced; }
void DecrementAllExtensionsSilenced() { --AllExtensionsSilenced; } void DecrementAllExtensionsSilenced() { --AllExtensionsSilenced; }
bool hasAllExtensionsSilenced() { return AllExtensionsSilenced != 0; }
/// setDiagnosticMapping - This allows the client to specify that certain /// setDiagnosticMapping - This allows the client to specify that certain
/// warnings are ignored. Notes can never be mapped, errors can only be /// warnings are ignored. Notes can never be mapped, errors can only be

View File

@ -853,6 +853,9 @@ private:
DeclaratorChunk::ParamInfo InlineParams[16]; DeclaratorChunk::ParamInfo InlineParams[16];
bool InlineParamsUsed; bool InlineParamsUsed;
/// Extension - true if the declaration is preceded by __extension__.
bool Extension : 1;
friend struct DeclaratorChunk; friend struct DeclaratorChunk;
public: public:
@ -861,7 +864,7 @@ public:
Kind(DK_Abstract), Kind(DK_Abstract),
InvalidType(DS.getTypeSpecType() == DeclSpec::TST_error), InvalidType(DS.getTypeSpecType() == DeclSpec::TST_error),
GroupingParens(false), AttrList(0), AsmLabel(0), Type(0), GroupingParens(false), AttrList(0), AsmLabel(0), Type(0),
InlineParamsUsed(false) { InlineParamsUsed(false), Extension(false) {
} }
~Declarator() { ~Declarator() {
@ -1090,6 +1093,9 @@ public:
void setAsmLabel(ActionBase::ExprTy *E) { AsmLabel = E; } void setAsmLabel(ActionBase::ExprTy *E) { AsmLabel = E; }
ActionBase::ExprTy *getAsmLabel() const { return AsmLabel; } ActionBase::ExprTy *getAsmLabel() const { return AsmLabel; }
void setExtension(bool Val = true) { Extension = Val; }
bool getExtension() const { return Extension; }
ActionBase::TypeTy *getDeclaratorIdType() const { return Type; } ActionBase::TypeTy *getDeclaratorIdType() const { return Type; }
OverloadedOperatorKind getOverloadedOperator() const { return OperatorKind; } OverloadedOperatorKind getOverloadedOperator() const { return OperatorKind; }

View File

@ -1509,10 +1509,19 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
// Convert them all to fields. // Convert them all to fields.
for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) { for (unsigned i = 0, e = FieldDeclarators.size(); i != e; ++i) {
FieldDeclarator &FD = FieldDeclarators[i]; FieldDeclarator &FD = FieldDeclarators[i];
DeclPtrTy Field;
// Install the declarator into the current TagDecl. // Install the declarator into the current TagDecl.
DeclPtrTy Field = Actions.ActOnField(CurScope, TagDecl, if (FD.D.getExtension()) {
// Silences extension warnings
ExtensionRAIIObject O(Diags);
Field = Actions.ActOnField(CurScope, TagDecl,
DS.getSourceRange().getBegin(), DS.getSourceRange().getBegin(),
FD.D, FD.BitfieldSize); FD.D, FD.BitfieldSize);
} else {
Field = Actions.ActOnField(CurScope, TagDecl,
DS.getSourceRange().getBegin(),
FD.D, FD.BitfieldSize);
}
FieldDecls.push_back(Field); FieldDecls.push_back(Field);
} }
} else { // Handle @defs } else { // Handle @defs
@ -2016,6 +2025,8 @@ void Parser::ParseDeclarator(Declarator &D) {
void Parser::ParseDeclaratorInternal(Declarator &D, void Parser::ParseDeclaratorInternal(Declarator &D,
DirectDeclParseFunction DirectDeclParser) { DirectDeclParseFunction DirectDeclParser) {
if (Diags.hasAllExtensionsSilenced())
D.setExtension();
// C++ member pointers start with a '::' or a nested-name. // C++ member pointers start with a '::' or a nested-name.
// Member pointers get special handling, since there's no place for the // Member pointers get special handling, since there's no place for the
// scope spec in the generic path below. // scope spec in the generic path below.

View File

@ -24,7 +24,7 @@ h19_insline(n) // expected-warning {{parameter 'n' was not declared, defaulting
} }
struct foo { struct foo {
__extension__ __attribute__((packed)) x : 4; // expected-warning {{type specifier missing, defaults to 'int'}} __extension__ __attribute__((packed)) x : 4;
}; };