From c7974ca5312eefd00b9e927203def9fbd8c1d169 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Thu, 10 Dec 2009 01:05:11 +0000 Subject: [PATCH] Handle emitting static variables that have reference type. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91027 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDeclCXX.cpp | 5 ++++- test/CodeGenCXX/static-init.cpp | 12 ++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/CodeGen/CGDeclCXX.cpp b/lib/CodeGen/CGDeclCXX.cpp index 44038da7d1..d240a3b933 100644 --- a/lib/CodeGen/CGDeclCXX.cpp +++ b/lib/CodeGen/CGDeclCXX.cpp @@ -193,7 +193,10 @@ CodeGenFunction::EmitStaticCXXBlockVarDeclInit(const VarDecl &D, EmitBlock(InitBlock); if (D.getType()->isReferenceType()) { - ErrorUnsupported(D.getInit(), "static variable that binds to a reference"); + // We don't want to pass true for IsInitializer here, because a static + // reference to a temporary does not extend its lifetime. + EmitReferenceBindingToExpr(D.getInit(), D.getType(), + /*IsInitializer=*/false); } else EmitDeclInit(*this, D, GV); diff --git a/test/CodeGenCXX/static-init.cpp b/test/CodeGenCXX/static-init.cpp index 55877b2a71..91085440ae 100644 --- a/test/CodeGenCXX/static-init.cpp +++ b/test/CodeGenCXX/static-init.cpp @@ -1,13 +1,17 @@ -// RUN: clang-cc -triple=x86_64-apple-darwin9 -emit-llvm %s -o %t -// RUN: grep "call void @_ZN1AC1Ev" %t | count 1 -// RUN: grep "call i32 @__cxa_atexit(void (i8\*)\* bitcast (void (%.truct.A\*)\* @_ZN1AD1Ev to void (i8\*)\*), i8\* getelementptr inbounds (%.truct.A\* @_ZZ1fvE1a, i32 0, i32 0), i8\* bitcast (i8\*\* @__dso_handle to i8\*))" %t | count 1 - +// RUN: clang-cc %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s struct A { A(); ~A(); }; void f() { + // CHECK: call void @_ZN1AC1Ev( + // CHECK: call i32 @__cxa_atexit(void (i8*)* bitcast (void (%struct.A*)* @_ZN1AD1Ev to void (i8*)*), i8* getelementptr inbounds (%struct.A* @_ZZ1fvE1a, i32 0, i32 0), i8* bitcast (i8** @__dso_handle to i8*)) static A a; } +void g() { + // CHECK: call i8* @_Znwm(i64 1) + // CHECK: call void @_ZN1AC1Ev( + static A& a = *new A; +}