зеркало из https://github.com/microsoft/clang-1.git
Fix up constant expression handling to deal with the address
of a reference correctly. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72463 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
4a18784dea
Коммит
50c39ea485
|
@ -178,11 +178,20 @@ static bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) {
|
|||
}
|
||||
|
||||
APValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E)
|
||||
{
|
||||
{
|
||||
if (!E->hasGlobalStorage())
|
||||
return APValue();
|
||||
|
||||
return APValue(E, 0);
|
||||
|
||||
if (isa<FunctionDecl>(E->getDecl())) {
|
||||
return APValue(E, 0);
|
||||
} else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) {
|
||||
if (!VD->getType()->isReferenceType())
|
||||
return APValue(E, 0);
|
||||
if (VD->getInit())
|
||||
return Visit(VD->getInit());
|
||||
}
|
||||
|
||||
return APValue();
|
||||
}
|
||||
|
||||
APValue LValueExprEvaluator::VisitBlockExpr(BlockExpr *E)
|
||||
|
|
|
@ -478,21 +478,9 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
|
|||
|
||||
bool Success = false;
|
||||
|
||||
if (DestType->isReferenceType()) {
|
||||
// If the destination type is a reference type, we need to evaluate it
|
||||
// as an lvalue.
|
||||
if (E->EvaluateAsLValue(Result, Context)) {
|
||||
if (const Expr *LVBase = Result.Val.getLValueBase()) {
|
||||
if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(LVBase)) {
|
||||
const ValueDecl *VD = cast<ValueDecl>(DRE->getDecl());
|
||||
|
||||
// We can only initialize a reference with an lvalue if the lvalue
|
||||
// is not a reference itself.
|
||||
Success = !VD->getType()->isReferenceType();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else
|
||||
if (DestType->isReferenceType())
|
||||
Success = E->EvaluateAsLValue(Result, Context);
|
||||
else
|
||||
Success = E->Evaluate(Result, Context);
|
||||
|
||||
if (Success) {
|
||||
|
|
|
@ -11,6 +11,7 @@ void t2(int& a) {
|
|||
|
||||
int g;
|
||||
int& gr = g;
|
||||
int& grr = gr;
|
||||
void t3() {
|
||||
int b = gr;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче