diff --git a/AST/Decl.cpp b/AST/Decl.cpp index 55abe6f34d..0ed028ca54 100644 --- a/AST/Decl.cpp +++ b/AST/Decl.cpp @@ -13,6 +13,7 @@ #include "clang/AST/Decl.h" #include "clang/AST/DeclObjC.h" +#include "clang/AST/Attr.h" #include "clang/Basic/IdentifierTable.h" using namespace clang; @@ -258,6 +259,11 @@ const char *NamedDecl::getName() const { return ""; } +void ValueDecl::addAttr(Attr *attr) +{ + attr->setNext(Attrs); + Attrs = attr; +} FunctionDecl::~FunctionDecl() { delete[] ParamInfo; diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp index fc60a7a4aa..f21ba70c76 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -14,6 +14,7 @@ #include "Sema.h" #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/Attr.h" #include "clang/AST/Builtins.h" #include "clang/AST/Decl.h" #include "clang/AST/Expr.h" @@ -737,10 +738,8 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) { FunctionDecl *NewFD = new FunctionDecl(D.getIdentifierLoc(), II, R, SC, D.getDeclSpec().isInlineSpecified(), - LastDeclarator, - D.getDeclSpec().getAttributes()); - - // Transfer ownership of DeclSpec attributes to FunctionDecl + LastDeclarator); + // FIXME: Handle attributes. D.getDeclSpec().clearAttributes(); // Merge the decl with the existing one if appropriate. Since C functions @@ -989,7 +988,9 @@ Sema::ActOnParamDeclarator(struct DeclaratorChunk::ParamInfo &PI, Scope *FnScope parmDeclType = Context.getPointerType(parmDeclType); ParmVarDecl *New = new ParmVarDecl(PI.IdentLoc, II, parmDeclType, - VarDecl::None, 0, PI.AttrList); + VarDecl::None, 0); + // FIXME: Handle attributes + if (PI.InvalidType) New->setInvalidDecl(); diff --git a/include/clang/AST/Attr.h b/include/clang/AST/Attr.h index dc65cc70dc..82ba6b63fb 100644 --- a/include/clang/AST/Attr.h +++ b/include/clang/AST/Attr.h @@ -29,7 +29,7 @@ private: Kind AttrKind; protected: - Attr(Kind AK) : AttrKind(AK) {} + Attr(Kind AK) : Next(0), AttrKind(AK) {} virtual ~Attr() { delete Next; } diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index d72a5c80fc..0640222ea9 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -16,7 +16,6 @@ #include "clang/AST/Type.h" #include "clang/Basic/SourceLocation.h" -#include "clang/Parse/AttributeList.h" #include "llvm/ADT/APSInt.h" #include "llvm/Bitcode/SerializationFwd.h" @@ -25,6 +24,7 @@ class Decl; } namespace clang { +class Attr; class Expr; class Stmt; class StringLiteral; @@ -253,19 +253,20 @@ protected: class ValueDecl : public ScopedDecl { QualType DeclType; - /// Attributes - Linked list of attributes that are attached to this + /// Attrs - Linked list of attributes that are attached to this /// function. - AttributeList *Attributes; + Attr *Attrs; protected: ValueDecl(Kind DK, SourceLocation L, IdentifierInfo *Id, QualType T, - ScopedDecl *PrevDecl, AttributeList *A = 0) - : ScopedDecl(DK, L, Id, PrevDecl), DeclType(T), Attributes(A) {} + ScopedDecl *PrevDecl) + : ScopedDecl(DK, L, Id, PrevDecl), DeclType(T) {} public: QualType getType() const { return DeclType; } void setType(QualType newType) { DeclType = newType; } QualType getCanonicalType() const { return DeclType.getCanonicalType(); } - AttributeList *getAttributes() const { return Attributes; } + void addAttr(Attr *attr); + const Attr *getAttrs() const { return Attrs; } // Implement isa/cast/dyncast/etc. static bool classof(const Decl *D) { @@ -329,8 +330,8 @@ public: static bool classof(const VarDecl *D) { return true; } protected: VarDecl(Kind DK, SourceLocation L, IdentifierInfo *Id, QualType T, - StorageClass SC, ScopedDecl *PrevDecl, AttributeList *A = 0) - : ValueDecl(DK, L, Id, T, PrevDecl, A), Init(0) { SClass = SC; } + StorageClass SC, ScopedDecl *PrevDecl) + : ValueDecl(DK, L, Id, T, PrevDecl), Init(0) { SClass = SC; } private: Expr *Init; // FIXME: This can be packed into the bitfields in Decl. @@ -356,8 +357,8 @@ protected: class BlockVarDecl : public VarDecl { public: BlockVarDecl(SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S, - ScopedDecl *PrevDecl, AttributeList *A = 0) - : VarDecl(BlockVar, L, Id, T, S, PrevDecl, A) {} + ScopedDecl *PrevDecl) + : VarDecl(BlockVar, L, Id, T, S, PrevDecl) {} // Implement isa/cast/dyncast/etc. static bool classof(const Decl *D) { return D->getKind() == BlockVar; } @@ -377,8 +378,8 @@ protected: class FileVarDecl : public VarDecl { public: FileVarDecl(SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S, - ScopedDecl *PrevDecl, AttributeList *A = 0) - : VarDecl(FileVar, L, Id, T, S, PrevDecl, A) {} + ScopedDecl *PrevDecl) + : VarDecl(FileVar, L, Id, T, S, PrevDecl) {} // Implement isa/cast/dyncast/etc. static bool classof(const Decl *D) { return D->getKind() == FileVar; } @@ -395,8 +396,8 @@ protected: class ParmVarDecl : public VarDecl { public: ParmVarDecl(SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S, - ScopedDecl *PrevDecl, AttributeList *A = 0) - : VarDecl(ParmVar, L, Id, T, S, PrevDecl, A), + ScopedDecl *PrevDecl) + : VarDecl(ParmVar, L, Id, T, S, PrevDecl), objcDeclQualifier(OBJC_TQ_None) {} ObjCDeclQualifier getObjCDeclQualifier() const { return objcDeclQualifier; } @@ -431,8 +432,8 @@ public: }; FunctionDecl(SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S = None, bool isInline = false, - ScopedDecl *PrevDecl = 0, AttributeList *Attrs = 0) - : ValueDecl(Function, L, Id, T, PrevDecl, Attrs), + ScopedDecl *PrevDecl = 0) + : ValueDecl(Function, L, Id, T, PrevDecl), ParamInfo(0), Body(0), DeclChain(0), SClass(S), IsInline(isInline) {} virtual ~FunctionDecl();