summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@woboq.com>2015-09-04 10:17:10 +0000
committerOlivier Goffart <ogoffart@woboq.com>2015-09-04 10:17:10 +0000
commit1ba7dc38d0a1fd742d9502b516b35b004e5bb33f (patch)
tree67c9875eb9bfd912b5c71277a3c484585edf2fdf
parenta04668ff341a11b4f6b31b186d0c647fc5c198ee (diff)
downloadbcm5719-llvm-1ba7dc38d0a1fd742d9502b516b35b004e5bb33f.tar.gz
bcm5719-llvm-1ba7dc38d0a1fd742d9502b516b35b004e5bb33f.zip
Fix the perentheses location when the constructor is called on a class that has a destructor
llvm-svn: 246844
-rw-r--r--clang/lib/Sema/SemaCast.cpp7
-rw-r--r--clang/test/SemaCXX/sourceranges.cpp15
2 files changed, 19 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp
index dea9c22b74b..446c68055a6 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<CXXConstructExpr>(Op.SrcExpr.get()))
+
+ auto *SubExpr = Op.SrcExpr.get();
+ if (auto *BindExpr = dyn_cast<CXXBindTemporaryExpr>(SubExpr))
+ SubExpr = BindExpr->getSubExpr();
+ if (auto *ConstructExpr = dyn_cast<CXXConstructExpr>(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 9ba003aa204..8f2cfe5b11e 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<int> *p1) {
// CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:13> '<bound member function type>' ->~P
p1->~P<int>();
}
+
+struct D {
+ D(int);
+ ~D();
+};
+
+void construct() {
+ using namespace foo;
+ A a = A(12);
+ // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}} <col:9, col:13> 'class foo::A' 'void (int)'
+ D d = D(12);
+ // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}} <col:9, col:13> 'struct D' 'void (int)'
+}
OpenPOWER on IntegriCloud