]> granicus.if.org Git - clang/commitdiff
add some code that will be used to remove processed attrs from
authorChris Lattner <sabre@nondot.org>
Wed, 20 Feb 2008 22:04:11 +0000 (22:04 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 20 Feb 2008 22:04:11 +0000 (22:04 +0000)
declspec, it is currently nonfunctional though.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47405 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaType.cpp
include/clang/Parse/AttributeList.h

index 7e0a0f025bfa1e93f052f4c1e138669981cb2d7d..e0d7eb5ee9d9711d537fe7b5bf79d2916a63eb0a 100644 (file)
@@ -21,7 +21,7 @@ using namespace clang;
 
 /// ConvertDeclSpecToType - Convert the specified declspec to the appropriate
 /// type object.  This returns null on error.
-static QualType ConvertDeclSpecToType(const DeclSpec &DS, ASTContext &Ctx) {
+static QualType ConvertDeclSpecToType(DeclSpec &DS, ASTContext &Ctx) {
   // FIXME: Should move the logic from DeclSpec::Finish to here for validity
   // checking.
   QualType Result;
@@ -140,6 +140,35 @@ static QualType ConvertDeclSpecToType(const DeclSpec &DS, ASTContext &Ctx) {
   assert(DS.getTypeSpecComplex() != DeclSpec::TSC_imaginary &&
          "FIXME: imaginary types not supported yet!");
   
+  // See if there are any attributes on the declspec that apply to the type (as
+  // opposed to the decl).
+  if (!DS.getAttributes())
+    return Result;
+  
+  // Scan through and apply attributes to this type where it makes sense.  Some
+  // attributes (such as __address_space__, __vector_size__, etc) apply to the
+  // declspec, but others can be present in the decl spec even though they apply
+  // to the decl.  Here we apply and delete attributes that apply to the
+  // declspec and leave the others alone.
+  llvm::SmallVector<AttributeList *, 8> LeftOverAttrs;
+  AttributeList *AL = DS.getAttributes();
+  while (AL) {
+    AttributeList *ThisAttr = AL;
+    AL = AL->getNext();
+    
+    LeftOverAttrs.push_back(ThisAttr);
+  }
+  
+  // Rechain any attributes that haven't been deleted to the DeclSpec.
+  AttributeList *List = 0;
+  for (unsigned i = 0, e = LeftOverAttrs.size(); i != e; ++i) {
+    LeftOverAttrs[i]->setNext(List);
+    List = LeftOverAttrs[i];
+  }
+  
+  DS.clearAttributes();
+  DS.AddAttributes(List);
+  //DS.setAttributes(List);
   return Result;
 }
 
index cc3f52ac5f6ca6a641ce3cdcaf11b1769fa3568e..231a214f49e8ef2c309d4c0b6420b9203e0298a5 100644 (file)
@@ -50,8 +50,7 @@ public:
       // freed). If any element of the vector is non-null, we should assert.
       delete [] Args;
     }
-    if (Next)
-      delete Next;
+    delete Next;
   }
   
   IdentifierInfo *getAttributeName() const { return AttrName; }