]> granicus.if.org Git - clang/commitdiff
ISO/IEC TR 18037
authorNate Begeman <natebegeman@mac.com>
Fri, 14 Mar 2008 00:22:18 +0000 (00:22 +0000)
committerNate Begeman <natebegeman@mac.com>
Fri, 14 Mar 2008 00:22:18 +0000 (00:22 +0000)
An address space name cannot be used to qualify an object that has automatic
storage duration.  Still not catching ASQual'd allocas of array type, just
scalars at the moment.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48350 91177308-0d34-0410-b5e6-96231b3b80d8

Sema/SemaDecl.cpp
include/clang/Basic/DiagnosticKinds.def
test/Sema/address_spaces.c

index 7307fc4762f6699d23fb5c6ff851fbaa3adcfdc6..28940ac9392f60d60e874c609e5091f020df52e4 100644 (file)
@@ -757,7 +757,6 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
                                            D.getDeclSpec().isInlineSpecified(),
                                            LastDeclarator);
     // Handle attributes.
-
     HandleDeclAttributes(NewFD, D.getDeclSpec().getAttributes(),
                          D.getAttributes());
     
@@ -801,7 +800,13 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
     // Handle attributes prior to checking for duplicates in MergeVarDecl
     HandleDeclAttributes(NewVD, D.getDeclSpec().getAttributes(),
                          D.getAttributes());
-     
+    // Emit a warning (error?) if an address space was applied to decl with
+    // local storage.
+    if (NewVD->hasLocalStorage() && 
+        (NewVD->getCanonicalType().getAddressSpace() != 0)) {
+      Diag(D.getIdentifierLoc(), diag::err_as_qualified_auto_decl);
+      InvalidDecl = true;
+    }
     // Merge the decl with the existing one if appropriate. If the decl is
     // in an outer scope, it isn't the same thing.
     if (PrevDecl && S->isDeclScope(PrevDecl)) {
index ffad46609f8da420ac115b14bf544070ad96a57b..c3825624e4a567b3a089001d0fa4755952c4d178 100644 (file)
@@ -584,6 +584,8 @@ DIAG(err_attribute_address_space_not_int, ERROR,
      "address space attribute requires an integer constant")
 DIAG(err_attribute_address_multiple_qualifiers, ERROR,
      "multiple address spaces specified for type")
+DIAG(err_as_qualified_auto_decl, ERROR,
+     "automatic variable qualified with an address space")
 DIAG(err_attribute_annotate_no_string, ERROR,
      "argument to annotate attribute was not a string literal")
 DIAG(warn_attribute_ignored, WARNING,
index 7171567d63d2f8fe6b6abcf8a4226574d3b18533..abf8cbdcebd5ae85a249043a6f476b66c6f39061 100644 (file)
@@ -11,5 +11,7 @@ void foo(_AS3 float *a) {
   int _AS1 _AS2 *Y;  // expected-error {{multiple address spaces specified for type}}
   int *_AS1 _AS2 *Z;  // expected-error {{multiple address spaces specified for type}}
 
+  _AS1 int local; // expected-error {{automatic variable qualified with an address space}}
+
   *a = 5.0f;
 }