Fix IRgen of constant expressions referring to external/static
variables. - PR3657. llvm-svn: 65381
This commit is contained in:
parent
c5437ea429
commit
d4ecca135a
|
@ -384,11 +384,14 @@ public:
|
|||
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl))
|
||||
return CGM.GetAddrOfFunction(FD);
|
||||
if (const VarDecl* VD = dyn_cast<VarDecl>(Decl)) {
|
||||
if (VD->isFileVarDecl())
|
||||
return CGM.GetAddrOfGlobalVar(VD);
|
||||
else if (VD->isBlockVarDecl()) {
|
||||
assert(CGF && "Can't access static local vars without CGF");
|
||||
return CGF->GetAddrOfStaticLocalVar(VD);
|
||||
// We can never refer to a variable with local storage.
|
||||
if (!VD->hasLocalStorage()) {
|
||||
if (VD->isFileVarDecl() || VD->hasExternalStorage())
|
||||
return CGM.GetAddrOfGlobalVar(VD);
|
||||
else if (VD->isBlockVarDecl()) {
|
||||
assert(CGF && "Can't access static local vars without CGF");
|
||||
return CGF->GetAddrOfStaticLocalVar(VD);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -79,4 +79,11 @@ long long g16 = (long long) ((void*) 0xFFFFFFFF);
|
|||
// RUN: grep '@g17 = global i32\* @g15' %t &&
|
||||
int *g17 = (int *) ((long) &g15);
|
||||
|
||||
// RUN: grep '@g18.p = internal global \[1 x i32\*\] \[i32\* @g19\]' %t &&
|
||||
// FIXME: Should we really accept this in Sema?
|
||||
void g18(void) {
|
||||
extern int g19;
|
||||
static int *p[] = { &g19 };
|
||||
}
|
||||
|
||||
// RUN: true
|
||||
|
|
Loading…
Reference in New Issue