forked from OSchip/llvm-project
Fix PR4386 by implementing gcc's old behaviour (4.2) when initializing
variables with a comparison of a function pointer with 0. llvm-svn: 103253
This commit is contained in:
parent
872fad8627
commit
a1f9cc1bec
|
@ -70,9 +70,20 @@ static bool EvaluateComplex(const Expr *E, APValue &Result, EvalInfo &Info);
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
static bool EvalPointerValueAsBool(APValue& Value, bool& Result) {
|
||||
// FIXME: Is this accurate for all kinds of bases? If not, what would
|
||||
// the check look like?
|
||||
Result = Value.getLValueBase() || !Value.getLValueOffset().isZero();
|
||||
const Expr* Base = Value.getLValueBase();
|
||||
|
||||
Result = Base || !Value.getLValueOffset().isZero();
|
||||
|
||||
const DeclRefExpr* DeclRef = dyn_cast<DeclRefExpr>(Base);
|
||||
if (!DeclRef)
|
||||
return true;
|
||||
|
||||
const ValueDecl* Decl = DeclRef->getDecl();
|
||||
if (Decl->hasAttr<WeakAttr>() ||
|
||||
Decl->hasAttr<WeakRefAttr>() ||
|
||||
Decl->hasAttr<WeakImportAttr>())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -131,3 +131,17 @@ const wchar_t widestr[] = L"asdf";
|
|||
// PR5447
|
||||
const double pr5447 = (0.05 < -1.0) ? -1.0 : 0.0499878;
|
||||
|
||||
// PR4386
|
||||
|
||||
// None of these are constant initializers, but we implement GCC's old
|
||||
// behaviour of accepting bar and zed but not foo. GCC's behaviour was
|
||||
// changed in 2007 (rev 122551), so we should be able to change too one
|
||||
// day.
|
||||
int PR4386_bar();
|
||||
int PR4386_foo() __attribute((weak));
|
||||
int PR4386_zed();
|
||||
|
||||
int PR4386_a = ((void *) PR4386_bar) != 0;
|
||||
int PR4386_b = ((void *) PR4386_foo) != 0; // expected-error{{initializer element is not a compile-time constant}}
|
||||
int PR4386_c = ((void *) PR4386_zed) != 0;
|
||||
int PR4386_zed() __attribute((weak));
|
||||
|
|
Loading…
Reference in New Issue