Author: rjmccall Date: Wed Sep 5 12:22:40 2018 New Revision: 341491 URL: http://llvm.org/viewvc/llvm-project?rev=341491&view=rev Log: Forbid address spaces on compound literals in local scope.
Patch by Bevin Hansson! Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/Sema/address_spaces.c Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=341491&r1=341490&r2=341491&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Sep 5 12:22:40 2018 @@ -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< Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=341491&r1=341490&r2=341491&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Sep 5 12:22:40 2018 @@ -5727,12 +5727,20 @@ Sema::BuildCompoundLiteralExpr(SourceLoc 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. Modified: cfe/trunk/test/Sema/address_spaces.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/address_spaces.c?rev=341491&r1=341490&r2=341491&view=diff ============================================================================== --- cfe/trunk/test/Sema/address_spaces.c (original) +++ cfe/trunk/test/Sema/address_spaces.c Wed Sep 5 12:22:40 2018 @@ -73,3 +73,17 @@ __attribute__((address_space("12"))) int 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}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits