Skip to content
Snippets Groups Projects
Commit d4ecca13 authored by Daniel Dunbar's avatar Daniel Dunbar
Browse files

Fix IRgen of constant expressions referring to external/static

variables.
 - PR3657.

llvm-svn: 65381
parent c5437ea4
No related branches found
No related tags found
No related merge requests found
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment