diff --git a/AST/Decl.cpp b/AST/Decl.cpp
index 55abe6f..0ed028c 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 @@
   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 fc60a7a..f21ba70 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 @@
 
     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 @@
     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 dc65cc7..82ba6b6 100644
--- a/include/clang/AST/Attr.h
+++ b/include/clang/AST/Attr.h
@@ -29,7 +29,7 @@
   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 d72a5c8..0640222 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 @@
 }
 
 namespace clang {
+class Attr;
 class Expr;
 class Stmt;
 class StringLiteral;
@@ -253,19 +253,20 @@
 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 @@
   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 @@
 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 @@
 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 @@
 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 @@
   };
   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();
 
