ISO/IEC TR 18037

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.

llvm-svn: 48350
This commit is contained in:
Nate Begeman 2008-03-14 00:22:18 +00:00
parent 05d41356d0
commit 144625ef9b
3 changed files with 11 additions and 2 deletions

View 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)) {

View 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,

View 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;
}