[cfe-commits] r39628 - in /cfe/cfe/trunk: AST/Attr.cpp Sema/Sema.h Sema/SemaDecl.cpp Sema/SemaExpr.cpp clang.xcodeproj/project.pbxproj include/clang/AST/Attr.h

Steve Naroff snaroff at apple.com
Wed Jul 11 09:46:25 PDT 2007


Author: snaroff
Date: Wed Jul 11 11:46:24 2007
New Revision: 39628

URL: http://llvm.org/viewvc/llvm-project?rev=39628&view=rev
Log:
Bug #:
Submitted by:
Reviewed by:
Lot's of attribute scaffolding.
Modernized ParseArraySubscriptExpr...call DefaultFunctionArrayConversion (which
simplified the logic considerably) and upgrade Diags to use the range support.

Modified:
    cfe/cfe/trunk/AST/Attr.cpp
    cfe/cfe/trunk/Sema/Sema.h
    cfe/cfe/trunk/Sema/SemaDecl.cpp
    cfe/cfe/trunk/Sema/SemaExpr.cpp
    cfe/cfe/trunk/clang.xcodeproj/project.pbxproj
    cfe/cfe/trunk/include/clang/AST/Attr.h

Modified: cfe/cfe/trunk/AST/Attr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/AST/Attr.cpp?rev=39628&r1=39627&r2=39628&view=diff

==============================================================================
--- cfe/cfe/trunk/AST/Attr.cpp (original)
+++ cfe/cfe/trunk/AST/Attr.cpp Wed Jul 11 11:46:24 2007
@@ -17,10 +17,3 @@
 using namespace llvm;
 using namespace clang;
 
-Attr::Attr(SourceLocation L, IdentifierInfo *aName, 
-                IdentifierInfo *pname, Expr **elist, unsigned numargs)
-  : AttrName(aName), AttrLoc(L), ParmName(pname), NumArgs(numargs) {
-  Args = new Expr*[numargs];
-  for (unsigned i = 0; i != numargs; ++i)
-    Args[i] = elist[i];
-}

Modified: cfe/cfe/trunk/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/Sema.h?rev=39628&r1=39627&r2=39628&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/Sema.h (original)
+++ cfe/cfe/trunk/Sema/Sema.h Wed Jul 11 11:46:24 2007
@@ -110,7 +110,7 @@
   
   virtual DeclTy *ParseTag(Scope *S, unsigned TagType, TagKind TK,
                            SourceLocation KWLoc, IdentifierInfo *Name,
-                           SourceLocation NameLoc);
+                           SourceLocation NameLoc, AttributeList *Attr);
   virtual DeclTy *ParseField(Scope *S, DeclTy *TagDecl,SourceLocation DeclStart,
                              Declarator &D, ExprTy *BitfieldWidth);
   virtual void ParseRecordBody(SourceLocation RecLoc, DeclTy *TagDecl,
@@ -250,16 +250,6 @@
   /// ParseCXXBoolLiteral - Parse {true,false} literals.
   virtual ExprResult ParseCXXBoolLiteral(SourceLocation OpLoc,
                                          tok::TokenKind Kind);
-                                         
-  /// ParseAttribute GCC __attribute__
-  virtual AttrTy *ParseAttribute(
-    IdentifierInfo *AttrName, SourceLocation AttrNameLoc, AttrTy *PrevAttr,
-    IdentifierInfo *ParmName = 0, SourceLocation ParmNameLoc = SourceLocation(),
-    ExprTy **Args = 0, unsigned NumArgs = 0, 
-    SourceLocation LParenLoc = SourceLocation(),
-    SourceLocation RParenLoc = SourceLocation()
-  );
-    
 private:
   // UsualUnaryConversions - promotes integers (C99 6.3.1.1p2) and converts
   // functions and arrays to their respective pointers (C99 6.3.2.1)

Modified: cfe/cfe/trunk/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/SemaDecl.cpp?rev=39628&r1=39627&r2=39628&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/SemaDecl.cpp (original)
+++ cfe/cfe/trunk/Sema/SemaDecl.cpp Wed Jul 11 11:46:24 2007
@@ -595,7 +595,7 @@
 /// reference/declaration/definition of a tag.
 Sema::DeclTy *Sema::ParseTag(Scope *S, unsigned TagType, TagKind TK,
                              SourceLocation KWLoc, IdentifierInfo *Name,
-                             SourceLocation NameLoc) {
+                             SourceLocation NameLoc, AttributeList *Attr) {
   // If this is a use of an existing tag, it must have a name.
   assert((Name != 0 || TK == TK_Definition) &&
          "Nameless record must be a definition!");
@@ -901,17 +901,3 @@
   if (last)
     LastInGroupList.push_back((Decl*)last);
 }
-
-/// ParseAttribute GCC __attribute__
-Sema::AttrTy *Sema::ParseAttribute(
-    IdentifierInfo *AttrName, SourceLocation AttrNameLoc, AttrTy *PrevAttr,
-    IdentifierInfo *ParmName, SourceLocation ParmNameLoc,
-    ExprTy **Args, unsigned NumArgs, 
-    SourceLocation LParenLoc, SourceLocation RParenLoc) {
-  Attr *attrib = new Attr(AttrNameLoc, AttrName, ParmName, (Expr **)Args, 
-                          NumArgs);
-  if (PrevAttr)
-    // reuse Decl's "Next" pointer for chaining the attribute list
-    attrib->setNext(static_cast<Attr *>(PrevAttr));
-  return attrib;
-}

Modified: cfe/cfe/trunk/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/Sema/SemaExpr.cpp?rev=39628&r1=39627&r2=39628&view=diff

==============================================================================
--- cfe/cfe/trunk/Sema/SemaExpr.cpp (original)
+++ cfe/cfe/trunk/Sema/SemaExpr.cpp Wed Jul 11 11:46:24 2007
@@ -283,40 +283,45 @@
   assert(!t1.isNull() && "no type for array base expression");
   assert(!t2.isNull() && "no type for array index expression");
 
-  QualType canonT1 = t1.getCanonicalType();
-  QualType canonT2 = t2.getCanonicalType();
+  QualType canonT1 = DefaultFunctionArrayConversion(t1).getCanonicalType();
+  QualType canonT2 = DefaultFunctionArrayConversion(t2).getCanonicalType();
   
   // C99 6.5.2.1p2: the expression e1[e2] is by definition precisely equivalent
   // to the expression *((e1)+(e2)). This means the array "Base" may actually be 
   // in the subscript position. As a result, we need to derive the array base 
   // and index from the expression types.
   
+  Expr *baseExpr, *indexExpr;
   QualType baseType, indexType;
-  if (isa<ArrayType>(canonT1) || isa<PointerType>(canonT1)) {
+  if (isa<PointerType>(canonT1)) {
     baseType = canonT1;
     indexType = canonT2;
-  } else if (isa<ArrayType>(canonT2) || isa<PointerType>(canonT2)) { // uncommon
+    baseExpr = static_cast<Expr *>(Base);
+    indexExpr = static_cast<Expr *>(Idx);
+  } else if (isa<PointerType>(canonT2)) { // uncommon
     baseType = canonT2;
     indexType = canonT1;
-  } else 
-    return Diag(LLoc, diag::err_typecheck_subscript_value);
-
+    baseExpr = static_cast<Expr *>(Idx);
+    indexExpr = static_cast<Expr *>(Base);
+  } else {
+    return Diag(baseExpr->getLocStart(), diag::err_typecheck_subscript_value, 
+                baseExpr->getSourceRange());
+  }              
   // C99 6.5.2.1p1
-  if (!indexType->isIntegerType())
-    return Diag(LLoc, diag::err_typecheck_subscript);
-
+  if (!indexType->isIntegerType()) {
+    return Diag(indexExpr->getLocStart(), diag::err_typecheck_subscript,
+                indexExpr->getSourceRange());
+  }
   // FIXME: need to deal with const...
-  QualType resultType;
-  if (ArrayType *ary = dyn_cast<ArrayType>(baseType)) {
-    resultType = ary->getElementType();
-  } else if (PointerType *ary = dyn_cast<PointerType>(baseType)) {
-    resultType = ary->getPointeeType();
-    // in practice, the following check catches trying to index a pointer
-    // to a function (e.g. void (*)(int)). Functions are not objects in c99.
-    if (!resultType->isObjectType())
-      return Diag(LLoc, diag::err_typecheck_subscript_not_object,
-                  baseType.getAsString());
-  } 
+  PointerType *ary = cast<PointerType>(baseType);
+  QualType resultType = ary->getPointeeType();
+  // in practice, the following check catches trying to index a pointer
+  // to a function (e.g. void (*)(int)). Functions are not objects in c99.
+  if (!resultType->isObjectType()) {
+    return Diag(baseExpr->getLocStart(), 
+                diag::err_typecheck_subscript_not_object,
+                baseType.getAsString(), baseExpr->getSourceRange());
+  }
   return new ArraySubscriptExpr((Expr*)Base, (Expr*)Idx, resultType, RLoc);
 }
 

Modified: cfe/cfe/trunk/clang.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/clang.xcodeproj/project.pbxproj?rev=39628&r1=39627&r2=39628&view=diff

==============================================================================
--- cfe/cfe/trunk/clang.xcodeproj/project.pbxproj (original)
+++ cfe/cfe/trunk/clang.xcodeproj/project.pbxproj Wed Jul 11 11:46:24 2007
@@ -12,6 +12,8 @@
 		1A869AA80BA21ABA008DA07A /* LiteralSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A869AA70BA21ABA008DA07A /* LiteralSupport.cpp */; };
 		84916BE50C161E580080778F /* Attr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84916BE40C161E580080778F /* Attr.cpp */; };
 		84916BE70C161E800080778F /* Attr.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84916BE60C161E800080778F /* Attr.h */; };
+		84D9A8880C1A57E100AC7ABC /* AttributeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84D9A8870C1A57E100AC7ABC /* AttributeList.cpp */; };
+		84D9A88C0C1A581300AC7ABC /* AttributeList.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84D9A88B0C1A581300AC7ABC /* AttributeList.h */; };
 		DE01DA490B12ADA300AC22CE /* PPCallbacks.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE01DA480B12ADA300AC22CE /* PPCallbacks.h */; };
 		DE06756C0C051CFE00EBBFD8 /* ParseExprCXX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DE06756B0C051CFE00EBBFD8 /* ParseExprCXX.cpp */; };
 		DE06B73E0A8307640050E87E /* LangOptions.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DE06B73D0A8307640050E87E /* LangOptions.h */; };
@@ -168,6 +170,7 @@
 				84916BE70C161E800080778F /* Attr.h in CopyFiles */,
 				F0226FD30C18084500141F42 /* TextDiagnosticPrinter.h in CopyFiles */,
 				DEEBBD440C19C5D200A9FE82 /* TODO.txt in CopyFiles */,
+				84D9A88C0C1A581300AC7ABC /* AttributeList.h in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 1;
 		};
@@ -179,6 +182,8 @@
 		1A869AA70BA21ABA008DA07A /* LiteralSupport.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = LiteralSupport.cpp; sourceTree = "<group>"; };
 		84916BE40C161E580080778F /* Attr.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Attr.cpp; path = AST/Attr.cpp; sourceTree = "<group>"; };
 		84916BE60C161E800080778F /* Attr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Attr.h; path = include/clang/AST/Attr.h; sourceTree = "<group>"; };
+		84D9A8870C1A57E100AC7ABC /* AttributeList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = AttributeList.cpp; path = Parse/AttributeList.cpp; sourceTree = "<group>"; };
+		84D9A88B0C1A581300AC7ABC /* AttributeList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AttributeList.h; path = clang/Parse/AttributeList.h; sourceTree = "<group>"; };
 		8DD76F6C0486A84900D96B5E /* clang */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = clang; sourceTree = BUILT_PRODUCTS_DIR; };
 		DE01DA480B12ADA300AC22CE /* PPCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PPCallbacks.h; sourceTree = "<group>"; };
 		DE06756B0C051CFE00EBBFD8 /* ParseExprCXX.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ParseExprCXX.cpp; path = Parse/ParseExprCXX.cpp; sourceTree = "<group>"; };
@@ -336,6 +341,7 @@
 		DE1F21F20A7D84E800FBF588 /* Parse */ = {
 			isa = PBXGroup;
 			children = (
+				84D9A88B0C1A581300AC7ABC /* AttributeList.h */,
 				DE06E8130A8FF9330050E87E /* Action.h */,
 				DE17336F0B068DC60080B521 /* DeclSpec.h */,
 				DE1F22020A7D852A00FBF588 /* Parser.h */,
@@ -347,6 +353,7 @@
 		DE1F22600A7D8C9B00FBF588 /* Parse */ = {
 			isa = PBXGroup;
 			children = (
+				84D9A8870C1A57E100AC7ABC /* AttributeList.cpp */,
 				DE3461260AFE68BE00DBC861 /* MinimalAction.cpp */,
 				DE06D42F0A8BB52D0050E87E /* Parser.cpp */,
 				DE3460040AFDCC6500DBC861 /* ParseInit.cpp */,
@@ -631,6 +638,7 @@
 				DE4264FC0C113592005A861D /* CGDecl.cpp in Sources */,
 				84916BE50C161E580080778F /* Attr.cpp in Sources */,
 				F0226FD20C18084500141F42 /* TextDiagnosticPrinter.cpp in Sources */,
+				84D9A8880C1A57E100AC7ABC /* AttributeList.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: cfe/cfe/trunk/include/clang/AST/Attr.h
URL: http://llvm.org/viewvc/llvm-project/cfe/cfe/trunk/include/clang/AST/Attr.h?rev=39628&r1=39627&r2=39628&view=diff

==============================================================================
--- cfe/cfe/trunk/include/clang/AST/Attr.h (original)
+++ cfe/cfe/trunk/include/clang/AST/Attr.h Wed Jul 11 11:46:24 2007
@@ -22,43 +22,6 @@
 class IdentifierInfo;
 class Expr;
 
-/// Attr - Represents GCC's __attribute__ declaration. There are
-/// 4 forms of this construct...they are:
-///
-/// 1: __attribute__(( const )). ParmName/Args/NumArgs will all be unused.
-/// 2: __attribute__(( mode(byte) )). ParmName used, Args/NumArgs unused.
-/// 3: __attribute__(( format(printf, 1, 2) )). ParmName/Args/NumArgs all used.
-/// 4: __attribute__(( aligned(16) )). ParmName is unused, Args/Num used.
-///
-class Attr {
-  IdentifierInfo *AttrName;
-  SourceLocation AttrLoc;
-  IdentifierInfo *ParmName;
-  Expr **Args;
-  unsigned NumArgs;
-  Attr *Next;
-public:
-  Attr(SourceLocation L, IdentifierInfo *AttrName, 
-       IdentifierInfo *ParmName, Expr **args, unsigned numargs);
-  ~Attr() {
-    delete [] Args;
-  }
-  
-  IdentifierInfo *getAttributeName() const { return AttrName; }
-  IdentifierInfo *getParameterName() const { return ParmName; }
-  
-  Attr *getNext() const { return Next; }
-  void setNext(Attr *N) { Next = N; }
-
-  /// getNumArgs - Return the number of actual arguments to this attribute.
-  unsigned getNumArgs() const { return NumArgs; }
-  
-  /// getArg - Return the specified argument.
-  Expr *getArg(unsigned Arg) const {
-    assert(Arg < NumArgs && "Arg access out of range!");
-    return Args[Arg];
-  }
-};
 
 }  // end namespace clang
 }  // end namespace llvm





More information about the cfe-commits mailing list