зеркало из https://github.com/microsoft/clang-1.git
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
This commit is contained in:
Родитель
871dc3e225
Коммит
27a84d0161
|
@ -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<
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
Загрузка…
Ссылка в новой задаче