From 1ba7dc38d0a1fd742d9502b516b35b004e5bb33f Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Fri, 4 Sep 2015 10:17:10 +0000 Subject: [PATCH] Fix the perentheses location when the constructor is called on a class that has a destructor llvm-svn: 246844 --- clang/lib/Sema/SemaCast.cpp | 7 +++++-- clang/test/SemaCXX/sourceranges.cpp | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp index dea9c22b74b7..446c68055a65 100644 --- a/clang/lib/Sema/SemaCast.cpp +++ b/clang/lib/Sema/SemaCast.cpp @@ -2483,8 +2483,11 @@ ExprResult Sema::BuildCXXFunctionalCastExpr(TypeSourceInfo *CastTypeInfo, Op.CheckCXXCStyleCast(/*FunctionalStyle=*/true, /*ListInit=*/false); if (Op.SrcExpr.isInvalid()) return ExprError(); - - if (CXXConstructExpr *ConstructExpr = dyn_cast(Op.SrcExpr.get())) + + auto *SubExpr = Op.SrcExpr.get(); + if (auto *BindExpr = dyn_cast(SubExpr)) + SubExpr = BindExpr->getSubExpr(); + if (auto *ConstructExpr = dyn_cast(SubExpr)) ConstructExpr->setParenOrBraceRange(SourceRange(LPLoc, RPLoc)); return Op.complete(CXXFunctionalCastExpr::Create(Context, Op.ResultType, diff --git a/clang/test/SemaCXX/sourceranges.cpp b/clang/test/SemaCXX/sourceranges.cpp index 9ba003aa204a..8f2cfe5b11e2 100644 --- a/clang/test/SemaCXX/sourceranges.cpp +++ b/clang/test/SemaCXX/sourceranges.cpp @@ -7,7 +7,7 @@ class P { }; namespace foo { -class A { public: A() {} }; +class A { public: A(int = 0) {} }; enum B {}; typedef int C; } @@ -37,3 +37,16 @@ void destruct(foo::A *a1, foo::A *a2, P *p1) { // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} '' ->~P p1->~P(); } + +struct D { + D(int); + ~D(); +}; + +void construct() { + using namespace foo; + A a = A(12); + // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}} 'class foo::A' 'void (int)' + D d = D(12); + // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}} 'struct D' 'void (int)' +}