зеркало из https://github.com/microsoft/clang-1.git
Fix a problem in the GCC testsuite, exposed by r150557. Compound literals
are represented as prvalues in C++; don't be fooled into thinking they're global lvalues. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150870 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
e61eb0443a
Коммит
b78ae97165
|
@ -952,8 +952,10 @@ static bool IsGlobalLValue(APValue::LValueBase B) {
|
|||
switch (E->getStmtClass()) {
|
||||
default:
|
||||
return false;
|
||||
case Expr::CompoundLiteralExprClass:
|
||||
return cast<CompoundLiteralExpr>(E)->isFileScope();
|
||||
case Expr::CompoundLiteralExprClass: {
|
||||
const CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E);
|
||||
return CLE->isFileScope() && CLE->isLValue();
|
||||
}
|
||||
// A string literal has static storage duration.
|
||||
case Expr::StringLiteralClass:
|
||||
case Expr::PredefinedExprClass:
|
||||
|
@ -1002,6 +1004,9 @@ static bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc,
|
|||
APValue::LValueBase Base = LVal.getLValueBase();
|
||||
const SubobjectDesignator &Designator = LVal.getLValueDesignator();
|
||||
|
||||
// Check that the object is a global. Note that the fake 'this' object we
|
||||
// manufacture when checking potential constant expressions is conservatively
|
||||
// assumed to be global here.
|
||||
if (!IsGlobalLValue(Base)) {
|
||||
if (Info.getLangOpts().CPlusPlus0x) {
|
||||
const ValueDecl *VD = Base.dyn_cast<const ValueDecl*>();
|
||||
|
|
|
@ -1198,3 +1198,13 @@ namespace VLASizeof {
|
|||
* 3;
|
||||
}
|
||||
}
|
||||
|
||||
namespace CompoundLiteral {
|
||||
// FIXME:
|
||||
// We don't model the semantics of this correctly: the compound literal is
|
||||
// represented as a prvalue in the AST, but actually behaves like an lvalue.
|
||||
// We treat the compound literal as a temporary and refuse to produce a
|
||||
// pointer to it. This is OK: we're not required to treat this as a constant
|
||||
// in C++, and in C we model compound literals as lvalues.
|
||||
constexpr int *p = (int*)(int[1]){0}; // expected-warning {{C99}} expected-error {{constant expression}} expected-note 2{{temporary}}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче