From: Tanya Lattner Date: Wed, 30 Sep 2009 20:47:43 +0000 (+0000) Subject: Add an error for function parameters that have a qualified address space since this... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=27a84d01614609c094029a49f7a86f0f7f8fe7f1;p=clang Add an error for function parameters that have a qualified address space since this is not allowed by the embedded c extension spec. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83165 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 6843270ec0..06e1516686 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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< diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 5df4dca860..37f8aed474 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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) diff --git a/test/Sema/address_spaces.c b/test/Sema/address_spaces.c index 616f3fcda1..d9d23edb3c 100644 --- a/test/Sema/address_spaces.c +++ b/test/Sema/address_spaces.c @@ -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 {