[cfe-commits] r52772 - in /cfe/trunk: include/clang/Parse/DeclSpec.h lib/Parse/Parser.cpp lib/Sema/Sema.h lib/Sema/SemaDecl.cpp lib/Sema/SemaType.cpp

Chris Lattner sabre at nondot.org
Wed Jun 25 23:49:45 PDT 2008


Author: lattner
Date: Thu Jun 26 01:49:43 2008
New Revision: 52772

URL: http://llvm.org/viewvc/llvm-project?rev=52772&view=rev
Log:
Make Declarator::getDeclSpec() return a const reference to avoid
cases where mutation can introduce bugs.  Propagate around 'const'.

Modified:
    cfe/trunk/include/clang/Parse/DeclSpec.h
    cfe/trunk/lib/Parse/Parser.cpp
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/lib/Sema/SemaType.cpp

Modified: cfe/trunk/include/clang/Parse/DeclSpec.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/DeclSpec.h?rev=52772&r1=52771&r2=52772&view=diff

==============================================================================
--- cfe/trunk/include/clang/Parse/DeclSpec.h (original)
+++ cfe/trunk/include/clang/Parse/DeclSpec.h Thu Jun 26 01:49:43 2008
@@ -570,8 +570,15 @@
 
   /// getDeclSpec - Return the declaration-specifier that this declarator was
   /// declared with.
-  DeclSpec &getDeclSpec() const { return DS; }
+  const DeclSpec &getDeclSpec() const { return DS; }
   
+  /// getMutableDeclSpec - Return a non-const version of the DeclSpec.  This
+  /// should be used with extreme care: declspecs can often be shared between
+  /// multiple declarators, so mutating the DeclSpec affects all of the
+  /// Declarators.  This should only be done when the declspec is known to not
+  /// be shared or when in error recovery etc.
+  DeclSpec &getMutableDeclSpec() { return DS; }
+
   TheContext getContext() const { return Context; }
   
   // getSourceRange - FIXME: This should be implemented.

Modified: cfe/trunk/lib/Parse/Parser.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=52772&r1=52771&r2=52772&view=diff

==============================================================================
--- cfe/trunk/lib/Parse/Parser.cpp (original)
+++ cfe/trunk/lib/Parse/Parser.cpp Thu Jun 26 01:49:43 2008
@@ -473,7 +473,7 @@
   // declaration-specifiers are completely optional in the grammar.
   if (getLang().ImplicitInt && D.getDeclSpec().getParsedSpecifiers() == 0) {
     const char *PrevSpec;
-    D.getDeclSpec().SetTypeSpecType(DeclSpec::TST_int, D.getIdentifierLoc(),
+    D.getMutableDeclSpec().SetTypeSpecType(DeclSpec::TST_int, D.getIdentifierLoc(),
                                     PrevSpec);
   }
 

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

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Thu Jun 26 01:49:43 2008
@@ -296,9 +296,9 @@
   ScopedDecl *ImplicitlyDefineFunction(SourceLocation Loc, IdentifierInfo &II,
                                  Scope *S);
   // Decl attributes - this routine is the top level dispatcher. 
-  void HandleDeclAttributes(Decl *New, AttributeList *declspec_prefix,
-                            AttributeList *declarator_postfix);
-  void HandleDeclAttribute(Decl *New, AttributeList *rawAttr);
+  void HandleDeclAttributes(Decl *New, const AttributeList *DeclSpecAttrs,
+                            const AttributeList *DeclaratorAttrs);
+  void HandleDeclAttribute(Decl *New, const AttributeList *rawAttr);
 
   /// HandleAddressSpaceTypeAttribute - this attribute is only applicable to 
   /// objects without automatic storage duration. 
@@ -311,7 +311,7 @@
   /// primitive type.  Note that this is a variable attribute, and not
   /// a type attribute.
   QualType HandleModeTypeAttribute(QualType curType, 
-                                   AttributeList *rawAttr);                                
+                                   const AttributeList *rawAttr);
 
   // HandleVectorTypeAttribute - this attribute is only applicable to 
   // integral and float scalars, although arrays, pointers, and function
@@ -321,24 +321,26 @@
   // The raw attribute should contain precisely 1 argument, the vector size 
   // for the variable, measured in bytes. If curType and rawAttr are well
   // formed, this routine will return a new vector type.
-  QualType HandleVectorTypeAttribute(QualType curType, AttributeList *rawAttr);
-  void HandleExtVectorTypeAttribute(TypedefDecl *d, AttributeList *rawAttr);
-  
-  void HandleAlignedAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleAliasAttribute(Decl *d, AttributeList *rawAttr);
-  void HandlePackedAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleAnnotateAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleNoReturnAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleDeprecatedAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleWeakAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleDLLImportAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleDLLExportAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleVisibilityAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleNothrowAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleFormatAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleStdCallAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleFastCallAttribute(Decl *d, AttributeList *rawAttr);
-  void HandleTransparentUnionAttribute(Decl *d, AttributeList *rawAttr);
+  QualType HandleVectorTypeAttribute(QualType curType,
+                                     const AttributeList *rawAttr);
+  void HandleExtVectorTypeAttribute(TypedefDecl *d, 
+                                    const AttributeList *rawAttr);
+  
+  void HandleAlignedAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleAliasAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandlePackedAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleAnnotateAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleNoReturnAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleDeprecatedAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleWeakAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleDLLImportAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleDLLExportAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleVisibilityAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleNothrowAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleFormatAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleStdCallAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleFastCallAttribute(Decl *d, const AttributeList *rawAttr);
+  void HandleTransparentUnionAttribute(Decl *d, const AttributeList *rawAttr);
   
   void WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
                            bool &IncompleteImpl);

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

==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Jun 26 01:49:43 2008
@@ -1379,19 +1379,19 @@
 /// to introduce parameters into function prototype scope.
 Sema::DeclTy *
 Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
-  DeclSpec &DS = D.getDeclSpec();
+  const DeclSpec &DS = D.getDeclSpec();
   
   // Verify C99 6.7.5.3p2: The only SCS allowed is 'register'.
   if (DS.getStorageClassSpec() != DeclSpec::SCS_unspecified &&
       DS.getStorageClassSpec() != DeclSpec::SCS_register) {
     Diag(DS.getStorageClassSpecLoc(),
          diag::err_invalid_storage_class_in_func_decl);
-    DS.ClearStorageClassSpecs();
+    D.getMutableDeclSpec().ClearStorageClassSpecs();
   }
   if (DS.isThreadSpecified()) {
     Diag(DS.getThreadSpecLoc(),
          diag::err_invalid_storage_class_in_func_decl);
-    DS.ClearStorageClassSpecs();
+    D.getMutableDeclSpec().ClearStorageClassSpecs();
   }
   
   // Check that there are no default arguments inside the type of this
@@ -2326,7 +2326,7 @@
   return LinkageSpecDecl::Create(Context, Loc, Language, dcl);
 }
 
-void Sema::HandleDeclAttribute(Decl *New, AttributeList *Attr) {
+void Sema::HandleDeclAttribute(Decl *New, const AttributeList *Attr) {
   
   switch (Attr->getKind()) {
   case AttributeList::AT_vector_size:
@@ -2421,35 +2421,35 @@
   }
 }
 
-void Sema::HandleDeclAttributes(Decl *New, AttributeList *declspec_prefix,
-                                AttributeList *declarator_postfix) {
-  if (declspec_prefix == 0 && declarator_postfix == 0) return;
-  
-  while (declspec_prefix) {
-    HandleDeclAttribute(New, declspec_prefix);
-    declspec_prefix = declspec_prefix->getNext();
+void Sema::HandleDeclAttributes(Decl *New, const AttributeList *DeclSpecAttrs,
+                                const AttributeList *DeclaratorAttrs) {
+  if (DeclSpecAttrs == 0 && DeclaratorAttrs == 0) return;
+  
+  while (DeclSpecAttrs) {
+    HandleDeclAttribute(New, DeclSpecAttrs);
+    DeclSpecAttrs = DeclSpecAttrs->getNext();
   }
   
   // If there are any type attributes that were in the declarator, apply them to
   // its top level type.
   if (ValueDecl *VD = dyn_cast<ValueDecl>(New)) {
     QualType DT = VD->getType();
-    ProcessTypeAttributes(DT, declarator_postfix);
+    ProcessTypeAttributes(DT, DeclaratorAttrs);
     VD->setType(DT);
   } else if (TypedefDecl *TD = dyn_cast<TypedefDecl>(New)) {
     QualType DT = TD->getUnderlyingType();
-    ProcessTypeAttributes(DT, declarator_postfix);
+    ProcessTypeAttributes(DT, DeclaratorAttrs);
     TD->setUnderlyingType(DT);
   }
   
-  while (declarator_postfix) {
-    HandleDeclAttribute(New, declarator_postfix);
-    declarator_postfix = declarator_postfix->getNext();
+  while (DeclaratorAttrs) {
+    HandleDeclAttribute(New, DeclaratorAttrs);
+    DeclaratorAttrs = DeclaratorAttrs->getNext();
   }
 }
 
 void Sema::HandleExtVectorTypeAttribute(TypedefDecl *tDecl, 
-                                        AttributeList *rawAttr) {
+                                        const AttributeList *rawAttr) {
   QualType curType = tDecl->getUnderlyingType();
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 1) {
@@ -2488,7 +2488,7 @@
 }
 
 QualType Sema::HandleVectorTypeAttribute(QualType curType, 
-                                         AttributeList *rawAttr) {
+                                         const AttributeList *rawAttr) {
   // check the attribute arugments.
   if (rawAttr->getNumArgs() != 1) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2547,7 +2547,7 @@
   return Context.getVectorType(curType, vectorSize/typeSize);
 }
 
-void Sema::HandlePackedAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandlePackedAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() > 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2572,7 +2572,7 @@
          rawAttr->getName()->getName());
 }
 
-void Sema::HandleAliasAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleAliasAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 1) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2598,7 +2598,7 @@
   d->addAttr(new AliasAttr(std::string(Alias, AliasLen)));
 }
 
-void Sema::HandleNoReturnAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleNoReturnAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2617,7 +2617,7 @@
   d->addAttr(new NoReturnAttr());
 }
 
-void Sema::HandleDeprecatedAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleDeprecatedAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2628,7 +2628,7 @@
   d->addAttr(new DeprecatedAttr());
 }
 
-void Sema::HandleVisibilityAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleVisibilityAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 1) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2667,7 +2667,7 @@
   d->addAttr(new VisibilityAttr(type));
 }
 
-void Sema::HandleWeakAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleWeakAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2678,7 +2678,7 @@
   d->addAttr(new WeakAttr());
 }
 
-void Sema::HandleDLLImportAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleDLLImportAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2689,7 +2689,7 @@
   d->addAttr(new DLLImportAttr());
 }
 
-void Sema::HandleDLLExportAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleDLLExportAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2700,7 +2700,7 @@
   d->addAttr(new DLLExportAttr());
 }
 
-void Sema::HandleStdCallAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleStdCallAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2711,7 +2711,7 @@
   d->addAttr(new StdCallAttr());
 }
 
-void Sema::HandleFastCallAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleFastCallAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2722,7 +2722,7 @@
   d->addAttr(new FastCallAttr());
 }
 
-void Sema::HandleNothrowAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleNothrowAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2775,7 +2775,7 @@
 
 /// Handle __attribute__((format(type,idx,firstarg))) attributes
 /// based on http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
-void Sema::HandleFormatAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleFormatAttribute(Decl *d, const AttributeList *rawAttr) {
 
   if (!rawAttr->getParameterName()) {
     Diag(rawAttr->getLoc(), diag::err_attribute_argument_n_not_string,
@@ -2921,7 +2921,8 @@
                             Idx.getZExtValue(), FirstArg.getZExtValue()));
 }
 
-void Sema::HandleTransparentUnionAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleTransparentUnionAttribute(Decl *d,
+                                           const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 0) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2944,7 +2945,7 @@
 // Ty->addAttr(new TransparentUnionAttr());
 }
 
-void Sema::HandleAnnotateAttribute(Decl *d, AttributeList *rawAttr) {
+void Sema::HandleAnnotateAttribute(Decl *d, const AttributeList *rawAttr) {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() != 1) {
     Diag(rawAttr->getLoc(), diag::err_attribute_wrong_number_arguments,
@@ -2964,7 +2965,7 @@
                                           SE->getByteLength())));
 }
 
-void Sema::HandleAlignedAttribute(Decl *d, AttributeList *rawAttr)
+void Sema::HandleAlignedAttribute(Decl *d, const AttributeList *rawAttr)
 {
   // check the attribute arguments.
   if (rawAttr->getNumArgs() > 1) {

Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=52772&r1=52771&r2=52772&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Thu Jun 26 01:49:43 2008
@@ -563,7 +563,7 @@
 /// HandleModeTypeAttribute - Process a mode attribute on the
 /// specified type.
 QualType Sema::HandleModeTypeAttribute(QualType Type, 
-                                       AttributeList *Attr) {
+                                       const AttributeList *Attr) {
   // This attribute isn't documented, but glibc uses it.  It changes
   // the width of an int or unsigned int to the specified size.
 





More information about the cfe-commits mailing list