diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-08-05 18:17:32 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-08-05 18:17:32 +0000 |
commit | d460cb43564ea511b8356f4f2bc817918206346e (patch) | |
tree | b0a956d4525858809d53cf605b226ee8db1464e7 | |
parent | 4b5c761af2221e17c2a9d9ae16a02f8d3ecb7b49 (diff) | |
download | bcm5719-llvm-d460cb43564ea511b8356f4f2bc817918206346e.tar.gz bcm5719-llvm-d460cb43564ea511b8356f4f2bc817918206346e.zip |
Handle destruction of temporaries used in default argument
construction of constructor calls.
llvm-svn: 78222
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 1 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/default-arg-temps.cpp | 14 |
3 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 8c1b880b869..106c754d756 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -2396,6 +2396,7 @@ void Sema::InitializeVarWithConstructor(VarDecl *VD, DeclInitType, Constructor, false, Exprs, NumExprs); MarkDeclarationReferenced(VD->getLocation(), Constructor); + Temp = MaybeCreateCXXExprWithTemporaries(Temp, /*DestroyTemps=*/true); VD->setInit(Context, Temp); } diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index a92f7f4a534..445cd691d6a 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -179,6 +179,7 @@ bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType, Init = BuildCXXConstructExpr(Context, DeclType, Constructor, false, &Init, 1); + Init = MaybeCreateCXXExprWithTemporaries(Init, /*DestroyTemps=*/true); return false; } diff --git a/clang/test/CodeGenCXX/default-arg-temps.cpp b/clang/test/CodeGenCXX/default-arg-temps.cpp index 2dcf773346a..2651446669b 100644 --- a/clang/test/CodeGenCXX/default-arg-temps.cpp +++ b/clang/test/CodeGenCXX/default-arg-temps.cpp @@ -7,9 +7,19 @@ struct T { void f(const T& t = T()); +class X { // ... +public: + X(); + X(const X&, const T& t = T()); +}; + void g() { - // RUN: grep "call void @_ZN1TC1Ev" %t | count 2 && - // RUN: grep "call void @_ZN1TD1Ev" %t | count 2 + // RUN: grep "call void @_ZN1TC1Ev" %t | count 4 && + // RUN: grep "call void @_ZN1TD1Ev" %t | count 4 f(); f(); + + X a; + X b(a); + X c = a; } |