forked from OSchip/llvm-project
Forbid address spaces on compound literals in local scope.
Patch by Bevin Hansson! llvm-svn: 341491
This commit is contained in:
parent
3e4e3b17c1
commit
7fa8af0abe
|
@ -2612,6 +2612,8 @@ def err_arg_with_address_space : Error<
|
|||
"parameter may not be qualified with an address space">;
|
||||
def err_field_with_address_space : Error<
|
||||
"field may not be qualified with an address space">;
|
||||
def err_compound_literal_with_address_space : Error<
|
||||
"compound literal in function scope may not be qualified with an address space">;
|
||||
def err_attr_objc_ownership_redundant : Error<
|
||||
"the type %0 is already explicitly ownership-qualified">;
|
||||
def err_invalid_nsnumber_type : Error<
|
||||
|
|
|
@ -5727,12 +5727,20 @@ Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo,
|
|||
LiteralExpr = Result.get();
|
||||
|
||||
bool isFileScope = !CurContext->isFunctionOrMethod();
|
||||
if (isFileScope &&
|
||||
!LiteralExpr->isTypeDependent() &&
|
||||
!LiteralExpr->isValueDependent() &&
|
||||
!literalType->isDependentType()) { // 6.5.2.5p3
|
||||
if (CheckForConstantInitializer(LiteralExpr, literalType))
|
||||
return ExprError();
|
||||
if (isFileScope) {
|
||||
if (!LiteralExpr->isTypeDependent() &&
|
||||
!LiteralExpr->isValueDependent() &&
|
||||
!literalType->isDependentType()) // C99 6.5.2.5p3
|
||||
if (CheckForConstantInitializer(LiteralExpr, literalType))
|
||||
return ExprError();
|
||||
} else if (literalType.getAddressSpace() != LangAS::opencl_private &&
|
||||
literalType.getAddressSpace() != LangAS::Default) {
|
||||
// Embedded-C extensions to C99 6.5.2.5:
|
||||
// "If the compound literal occurs inside the body of a function, the
|
||||
// type name shall not be qualified by an address-space qualifier."
|
||||
Diag(LParenLoc, diag::err_compound_literal_with_address_space)
|
||||
<< SourceRange(LParenLoc, LiteralExpr->getSourceRange().getEnd());
|
||||
return ExprError();
|
||||
}
|
||||
|
||||
// In C, compound literals are l-values for some reason.
|
||||
|
|
|
@ -73,3 +73,17 @@ __attribute__((address_space("12"))) int *i; // expected-error {{'address_space'
|
|||
char* cmp(_AS1 char *x, _AS2 char *y) {
|
||||
return x < y ? x : y; // expected-error{{conditional operator with the second and third operands of type ('__attribute__((address_space(1))) char *' and '__attribute__((address_space(2))) char *') which are pointers to non-overlapping address spaces}}
|
||||
}
|
||||
|
||||
struct SomeStruct {
|
||||
int a;
|
||||
long b;
|
||||
int c;
|
||||
};
|
||||
|
||||
// Compound literals in function scope are lvalues with automatic storage duration,
|
||||
// so they cannot realistically be qualified with an address space.
|
||||
void as_compound_literal() {
|
||||
(_AS1 struct SomeStruct){1, 2, 3}; // expected-error {{compound literal in function scope may not be qualified with an address space}}
|
||||
(_AS1 char[]){"test"}; // expected-error {{compound literal in function scope may not be qualified with an address space}}
|
||||
(_AS1 char[]){'a', 'b', 'c'}; // expected-error {{compound literal in function scope may not be qualified with an address space}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue