[cfe-commits] r47197 - in /cfe/trunk: Sema/Sema.h Sema/SemaDecl.cpp include/clang/Basic/DiagnosticKinds.def

Anders Carlsson andersca at mac.com
Fri Feb 15 16:29:18 PST 2008


Author: andersca
Date: Fri Feb 15 18:29:18 2008
New Revision: 47197

URL: http://llvm.org/viewvc/llvm-project?rev=47197&view=rev
Log:
Handle packed attribute correctly

Modified:
    cfe/trunk/Sema/Sema.h
    cfe/trunk/Sema/SemaDecl.cpp
    cfe/trunk/include/clang/Basic/DiagnosticKinds.def

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

==============================================================================
--- cfe/trunk/Sema/Sema.h (original)
+++ cfe/trunk/Sema/Sema.h Fri Feb 15 18:29:18 2008
@@ -267,7 +267,8 @@
   void HandleOCUVectorTypeAttribute(TypedefDecl *d, AttributeList *rawAttr);
   
   void HandleAlignedAttribute(Decl *d, AttributeList *rawAttr);
-    
+  void HandlePackedAttribute(Decl *d, AttributeList *rawAttr);
+  
   void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
                            bool &IncompleteImpl);
                            

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

==============================================================================
--- cfe/trunk/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/Sema/SemaDecl.cpp Fri Feb 15 18:29:18 2008
@@ -1242,6 +1242,7 @@
     S->AddDecl(New);
   }
   
+  HandleDeclAttributes(New, Attr, 0);
   return New;
 }
 
@@ -1300,6 +1301,9 @@
   else
     assert(0 && "Sema::ActOnField(): Unknown TagDecl");
     
+  HandleDeclAttributes(NewFD, D.getDeclSpec().getAttributes(),
+                       D.getAttributes());
+
   if (D.getInvalidType() || InvalidDecl)
     NewFD->setInvalidDecl();
   return NewFD;
@@ -1772,10 +1776,11 @@
       if (!newType.isNull()) // install the new addr spaced  type into the decl
         vDecl->setType(newType);
     }
-  } else if (attrLen == 7 && !memcmp(attrName, "aligned", 7)) {
-      HandleAlignedAttribute(New, rawAttr);
-  }
-  
+  } else if (attrLen == 7 && !memcmp(attrName, "aligned", 7))
+    HandleAlignedAttribute(New, rawAttr);
+  else if (attrLen == 6 && !memcmp(attrName, "packed", 6))
+    HandlePackedAttribute(New, rawAttr);
+
   // FIXME: add other attributes...
 }
 
@@ -1920,6 +1925,32 @@
   return Context.getVectorType(curType, vectorSize/typeSize);
 }
 
+void Sema::HandlePackedAttribute(Decl *d, AttributeList *rawAttr)
+{
+  // check the attribute arguments.
+  if (rawAttr->getNumArgs() > 0) {
+    Diag(rawAttr->getAttributeLoc(), diag::err_attribute_wrong_number_arguments,
+         std::string("0"));
+    return;
+  }
+  
+  if (TagDecl *TD = dyn_cast<TagDecl>(d))
+    TD->addAttr(new PackedAttr);
+  else if (FieldDecl *FD = dyn_cast<FieldDecl>(d)) {
+    // If the alignment is less than or equal to 8 bits, the packed attribute
+    // has no effect.
+    if (Context.getTypeAlign(FD->getType(), SourceLocation()) <= 8)
+      Diag(rawAttr->getAttributeLoc(), 
+           diag::warn_attribute_ignored_for_field_of_type,
+           rawAttr->getAttributeName()->getName(),
+           FD->getType().getAsString());
+    else
+      TD->addAttr(new PackedAttr);
+  } else
+    Diag(rawAttr->getAttributeLoc(), diag::warn_attribute_ignored,
+         rawAttr->getAttributeName()->getName());
+}
+  
 void Sema::HandleAlignedAttribute(Decl *d, AttributeList *rawAttr)
 {
   // check the attribute arguments.

Modified: cfe/trunk/include/clang/Basic/DiagnosticKinds.def
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticKinds.def?rev=47197&r1=47196&r2=47197&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticKinds.def (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticKinds.def Fri Feb 15 18:29:18 2008
@@ -579,6 +579,10 @@
      "vector component access limited to variables")
 DIAG(err_attribute_address_space_not_int, ERROR,
      "address space attribute requires an integer constant")
+DIAG(warn_attribute_ignored, WARNING,
+	"'%0' attribute ignored")
+DIAG(warn_attribute_ignored_for_field_of_type, WARNING,
+	"'%0' attribute ignored for field of type '%1'")
 
 // Function Parameter Semantic Analysis.
 DIAG(err_param_with_void_type, ERROR,





More information about the cfe-commits mailing list