From: Peter Collingbourne Date: Sat, 22 Feb 2014 02:59:41 +0000 (+0000) Subject: Correctly set brace range for CXXConstructExprs formed by list initialization. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c7ecd63edfc41546d1c6b18f4e0b9bc7c7f7c408;p=clang Correctly set brace range for CXXConstructExprs formed by list initialization. Differential Revision: http://llvm-reviews.chandlerc.com/D2711 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201926 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 75f60ba480..38e93f7858 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -5232,10 +5232,13 @@ PerformConstructorInitialization(Sema &S, ConstructKind = CXXConstructExpr::CK_Delegating; } - // Only get the parenthesis range if it is a direct construction. - SourceRange parenRange = - Kind.getKind() == InitializationKind::IK_Direct ? - Kind.getParenRange() : SourceRange(); + // Only get the parenthesis or brace range if it is a list initialization or + // direct construction. + SourceRange ParenOrBraceRange; + if (IsListInitialization) + ParenOrBraceRange = SourceRange(LBraceLoc, RBraceLoc); + else if (Kind.getKind() == InitializationKind::IK_Direct) + ParenOrBraceRange = Kind.getParenRange(); // If the entity allows NRVO, mark the construction as elidable // unconditionally. @@ -5247,7 +5250,7 @@ PerformConstructorInitialization(Sema &S, IsListInitialization, ConstructorInitRequiresZeroInit, ConstructKind, - parenRange); + ParenOrBraceRange); else CurInit = S.BuildCXXConstructExpr(Loc, Entity.getType(), Constructor, @@ -5256,7 +5259,7 @@ PerformConstructorInitialization(Sema &S, IsListInitialization, ConstructorInitRequiresZeroInit, ConstructKind, - parenRange); + ParenOrBraceRange); } if (CurInit.isInvalid()) return ExprError(); diff --git a/test/Analysis/inlining/path-notes.cpp b/test/Analysis/inlining/path-notes.cpp index a354e14df9..afbdf2146b 100644 --- a/test/Analysis/inlining/path-notes.cpp +++ b/test/Analysis/inlining/path-notes.cpp @@ -1506,7 +1506,7 @@ namespace PR17746 { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line120 -// CHECK-NEXT: col19 +// CHECK-NEXT: col20 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -1535,7 +1535,7 @@ namespace PR17746 { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line120 -// CHECK-NEXT: col19 +// CHECK-NEXT: col20 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: @@ -1787,7 +1787,7 @@ namespace PR17746 { // CHECK-NEXT: // CHECK-NEXT: // CHECK-NEXT: line128 -// CHECK-NEXT: col32 +// CHECK-NEXT: col33 // CHECK-NEXT: file0 // CHECK-NEXT: // CHECK-NEXT: diff --git a/unittests/AST/SourceLocationTest.cpp b/unittests/AST/SourceLocationTest.cpp index c08c2652b6..6e94442944 100644 --- a/unittests/AST/SourceLocationTest.cpp +++ b/unittests/AST/SourceLocationTest.cpp @@ -211,6 +211,16 @@ TEST(CXXFunctionalCastExpr, SourceRange) { functionalCastExpr(), Lang_CXX11)); } +TEST(CXXConstructExpr, SourceRange) { + RangeVerifier Verifier; + Verifier.expectRange(3, 14, 3, 19); + EXPECT_TRUE(Verifier.match( + "struct A { A(int, int); };\n" + "void f(A a);\n" + "void g() { f({0, 0}); }", + constructExpr(), Lang_CXX11)); +} + TEST(CXXTemporaryObjectExpr, SourceRange) { RangeVerifier Verifier; Verifier.expectRange(2, 6, 2, 12);