Fix IRgen of constant expressions referring to external/static

variables.
 - PR3657.

llvm-svn: 65381
This commit is contained in:
Daniel Dunbar 2009-02-24 18:41:57 +00:00
parent c5437ea429
commit d4ecca135a
2 changed files with 15 additions and 5 deletions

View File

@ -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;

View File

@ -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