From 188158db29f50443b6e412f2a40c800b2669c957 Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Thu, 8 Mar 2012 21:05:45 +0000 Subject: [PATCH] Turn explicit construction of temporaries using initializer list syntax into CXXTemporaryObjectExprs, not just CXXConstructExprs, which have a worrying tendency to vanish. Fixes PR12167. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152340 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaInit.cpp | 12 ++++++++---- test/SemaCXX/cxx0x-initializer-constructor.cpp | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index f18c344b8b..fe4815c30f 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -4671,9 +4671,10 @@ PerformConstructorInitialization(Sema &S, if (Entity.getKind() == InitializedEntity::EK_Temporary && - NumArgs != 1 && // FIXME: Hack to work around cast weirdness - (Kind.getKind() == InitializationKind::IK_Direct || - Kind.getKind() == InitializationKind::IK_Value)) { + (Kind.getKind() == InitializationKind::IK_DirectList || + (NumArgs != 1 && // FIXME: Hack to work around cast weirdness + (Kind.getKind() == InitializationKind::IK_Direct || + Kind.getKind() == InitializationKind::IK_Value)))) { // An explicitly-constructed temporary, e.g., X(1, 2). unsigned NumExprs = ConstructorArgs.size(); Expr **Exprs = (Expr **)ConstructorArgs.take(); @@ -4683,13 +4684,16 @@ PerformConstructorInitialization(Sema &S, TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo(); if (!TSInfo) TSInfo = S.Context.getTrivialTypeSourceInfo(Entity.getType(), Loc); + SourceRange ParenRange; + if (Kind.getKind() != InitializationKind::IK_DirectList) + ParenRange = Kind.getParenRange(); CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context, Constructor, TSInfo, Exprs, NumExprs, - Kind.getParenRange(), + ParenRange, HadMultipleCandidates, ConstructorInitRequiresZeroInit)); } else { diff --git a/test/SemaCXX/cxx0x-initializer-constructor.cpp b/test/SemaCXX/cxx0x-initializer-constructor.cpp index 14420d94dd..fdc882e049 100644 --- a/test/SemaCXX/cxx0x-initializer-constructor.cpp +++ b/test/SemaCXX/cxx0x-initializer-constructor.cpp @@ -218,3 +218,21 @@ namespace PR12117 { struct B { B(A); } b{{0}}; struct C { C(int); } c{0}; } + +namespace PR12167 { + template struct string {}; + + struct X { + X(const char v); + template bool operator()(T) const; + }; + + template bool g(const string& s, Comparator cmp) { + return cmp(s); + } + template bool f(const string &s) { + return g(s, X{'x'}); + } + + bool s = f(string<1>()); +} -- 2.40.0