forked from OSchip/llvm-project
				
			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.
 | 
			
		||||
  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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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; }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue