Fix a source range regression in C++ new expressions with call initializers.
authorDavid Blaikie <dblaikie@gmail.com>
Thu, 8 Nov 2012 22:53:48 +0000 (22:53 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Thu, 8 Nov 2012 22:53:48 +0000 (22:53 +0000)
Introduced in r167507, discovered in review by Abramo Bagnara.

llvm-svn: 167597

clang/lib/AST/ExprCXX.cpp
clang/unittests/AST/SourceLocationTest.cpp

index f60f195..55722a2 100644 (file)
@@ -130,6 +130,14 @@ CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
 
     SubExprs[i++] = placementArgs[j];
   }
+
+  switch (getInitializationStyle()) {
+  case CallInit:
+    this->Range.setEnd(DirectInitRange.getEnd()); break;
+  case ListInit:
+    this->Range.setEnd(getInitializer()->getSourceRange().getEnd()); break;
+  default: break;
+  }
 }
 
 void CXXNewExpr::AllocateArgsArray(ASTContext &C, bool isArray,
index 953cb9e..dec833d 100644 (file)
@@ -258,6 +258,12 @@ TEST(CXXNewExpr, ArrayRange) {
   EXPECT_TRUE(Verifier.match("void f() { new int[10]; }", newExpr()));
 }
 
+TEST(CXXNewExpr, ParenRange) {
+  RangeVerifier<CXXNewExpr> Verifier;
+  Verifier.expectRange(1, 12, 1, 20);
+  EXPECT_TRUE(Verifier.match("void f() { new int(); }", newExpr()));
+}
+
 TEST(MemberExpr, ImplicitMemberRange) {
   RangeVerifier<MemberExpr> Verifier;
   Verifier.expectRange(2, 30, 2, 30);