The address of a variable is only constant if the variable has global storage.

llvm-svn: 59939
This commit is contained in:
Anders Carlsson 2008-11-24 04:41:22 +00:00
parent 4c76e93507
commit a42ee44aab
2 changed files with 15 additions and 1 deletions

View File

@ -121,7 +121,7 @@ public:
}
APValue VisitParenExpr(ParenExpr *E) { return Visit(E->getSubExpr()); }
APValue VisitDeclRefExpr(DeclRefExpr *E) { return APValue(E, 0); }
APValue VisitDeclRefExpr(DeclRefExpr *E);
APValue VisitPredefinedExpr(PredefinedExpr *E) { return APValue(E, 0); }
APValue VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
APValue VisitMemberExpr(MemberExpr *E);
@ -135,6 +135,14 @@ static bool EvaluateLValue(const Expr* E, APValue& Result, EvalInfo &Info) {
return Result.isLValue();
}
APValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E)
{
if (!E->hasGlobalStorage())
return APValue();
return APValue(E, 0);
}
APValue LValueExprEvaluator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
if (E->isFileScope())
return APValue(E, 0);

View File

@ -20,3 +20,9 @@ EVAL_EXPR(13, x || 3.0)
unsigned int l_19 = 1;
EVAL_EXPR(14, (1 ^ l_19) && 1); // expected-error {{fields must have a constant size}}
void f()
{
int a;
EVAL_EXPR(15, (_Bool)&a); // expected-error {{fields must have a constant size}}
}