summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-08-26 14:27:30 +0000
committerDouglas Gregor <dgregor@apple.com>2009-08-26 14:27:30 +0000
commit66a985d16ee1c65a43f27bb56f2e8859c8f5110c (patch)
tree7f7af57d29015c5bd0d6b4358b26c42a027f38ce /clang
parentc4581eaca8434500e32f19af3ffd4b0fdd111e36 (diff)
downloadbcm5719-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.h1
-rw-r--r--clang/include/clang/Parse/DeclSpec.h8
-rw-r--r--clang/lib/Parse/ParseDecl.cpp17
-rw-r--r--clang/test/Sema/implicit-int.c2
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;
};
OpenPOWER on IntegriCloud