]> granicus.if.org Git - clang/commitdiff
Add an error for function parameters that have a qualified address space since this...
authorTanya Lattner <tonic@nondot.org>
Wed, 30 Sep 2009 20:47:43 +0000 (20:47 +0000)
committerTanya Lattner <tonic@nondot.org>
Wed, 30 Sep 2009 20:47:43 +0000 (20:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83165 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/Sema/address_spaces.c

index 6843270ec0e95651ef24e6de7d46deae948664dc..06e1516686b4f2a5d2de4a7ea3541ba651c9d791 100644 (file)
@@ -571,6 +571,8 @@ def err_implicit_pointer_address_space_cast : Error<
   "illegal implicit cast between two pointers with different address spaces">;
 def err_as_qualified_auto_decl : Error<
   "automatic variable qualified with an address space">;
+def err_arg_with_address_space : Error<
+  "parameter may not be qualified with an address space">;
 def err_attribute_not_string : Error<
   "argument to %0 attribute was not a string literal">;
 def err_attribute_section_invalid_for_target : Error<
index 5df4dca86023c5c519d49cfe5e6e566b21e601c4..37f8aed474480f7b84ed78f7a65fd7554eacd4b1 100644 (file)
@@ -3632,7 +3632,18 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
       << D.getCXXScopeSpec().getRange();
     New->setInvalidDecl();
   }
-
+  
+  // ISO/IEC TR 18037 S6.7.3: "The type of an object with automatic storage 
+  // duration shall not be qualified by an address-space qualifier."
+  // Since all parameters have automatic store duration, they can not have
+  // an address space.
+  if (T.getAddressSpace() != 0) {
+    Diag(D.getIdentifierLoc(),  
+         diag::err_arg_with_address_space);
+    New->setInvalidDecl();
+  }   
+  
+  
   // Add the parameter declaration into this scope.
   S->AddDecl(DeclPtrTy::make(New));
   if (II)
index 616f3fcda1a28ed1aeafb610036e69cdd35f5693..d9d23edb3cf48f27c55d000c373d63b0db3a6ac4 100644 (file)
@@ -4,7 +4,11 @@
 #define _AS2 __attribute__((address_space(2)))
 #define _AS3 __attribute__((address_space(3)))
 
-void foo(_AS3 float *a) {
+void bar(_AS2 int a); // expected-error {{parameter may not be qualified with an address space}}
+
+void foo(_AS3 float *a, 
+         _AS1 float b) // expected-error {{parameter may not be qualified with an address space}}
+{
   _AS2 *x;// expected-warning {{type specifier missing, defaults to 'int'}}
   _AS1 float * _AS2 *B;
 
@@ -21,7 +25,7 @@ void foo(_AS3 float *a) {
   // chosen specifically to overflow 32 bits and come out reasonable
   __attribute__((address_space(4294967500))) int *_boundsD; // expected-error {{address space is larger than the maximum supported}}
 
-  *a = 5.0f;
+  *a = 5.0f + b;
 }
 
 struct _st {