Fix bug in __extension__ handling for declarations, from Abramo
Bagnara with a fix from Enea Zaffanella! llvm-svn: 80094
This commit is contained in:
parent
c4581eaca8
commit
66a985d16e
|
@ -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
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue