summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEnea Zaffanella <zaffanella@cs.unipr.it>2013-07-07 06:41:54 +0000
committerEnea Zaffanella <zaffanella@cs.unipr.it>2013-07-07 06:41:54 +0000
commit8421a06314356a7e53819f9e13242bb5fb962141 (patch)
tree78868d857fa7c8642798dfa5dd0ea9a2f463b8e1 /clang
parent7a22921e5a2494b7929431b9816d97d361a39ea7 (diff)
downloadbcm5719-llvm-8421a06314356a7e53819f9e13242bb5fb962141.tar.gz
bcm5719-llvm-8421a06314356a7e53819f9e13242bb5fb962141.zip
Fixed source range for functional cast and unresolved construct expr nodes.
Added testcases. llvm-svn: 185773
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/AST/ExprCXX.h9
-rw-r--r--clang/include/clang/ASTMatchers/ASTMatchers.h12
-rw-r--r--clang/unittests/AST/MatchVerifier.h6
-rw-r--r--clang/unittests/AST/SourceLocationTest.cpp21
4 files changed, 45 insertions, 3 deletions
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index 925b16697cd..128664c97ef 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -1224,7 +1224,9 @@ public:
void setRParenLoc(SourceLocation L) { RParenLoc = L; }
SourceLocation getLocStart() const LLVM_READONLY { return TyBeginLoc; }
- SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
+ SourceLocation getLocEnd() const LLVM_READONLY {
+ return RParenLoc.isValid() ? RParenLoc : getSubExpr()->getLocEnd();
+ }
static bool classof(const Stmt *T) {
return T->getStmtClass() == CXXFunctionalCastExprClass;
@@ -3069,7 +3071,10 @@ public:
}
SourceLocation getLocStart() const LLVM_READONLY;
- SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
+ SourceLocation getLocEnd() const LLVM_READONLY {
+ assert(RParenLoc.isValid() || NumArgs == 1);
+ return RParenLoc.isValid() ? RParenLoc : getArg(0)->getLocEnd();
+ }
static bool classof(const Stmt *T) {
return T->getStmtClass() == CXXUnresolvedConstructExprClass;
diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h
index 110638a278d..aa2e4f7cb83 100644
--- a/clang/include/clang/ASTMatchers/ASTMatchers.h
+++ b/clang/include/clang/ASTMatchers/ASTMatchers.h
@@ -640,6 +640,18 @@ const internal::VariadicDynCastAllOfMatcher<
Stmt,
CXXConstructExpr> constructExpr;
+/// \brief Matches unresolved constructor call expressions.
+///
+/// Example matches T(t) in return statement of f
+/// (matcher = unresolvedConstructExpr())
+/// \code
+/// template <typename T>
+/// void f(const T& t) { return T(t); }
+/// \endcode
+const internal::VariadicDynCastAllOfMatcher<
+ Stmt,
+ CXXUnresolvedConstructExpr> unresolvedConstructExpr;
+
/// \brief Matches implicit and explicit this expressions.
///
/// Example matches the implicit this expression in "return i".
diff --git a/clang/unittests/AST/MatchVerifier.h b/clang/unittests/AST/MatchVerifier.h
index 7aa78860aa9..56dcc68f202 100644
--- a/clang/unittests/AST/MatchVerifier.h
+++ b/clang/unittests/AST/MatchVerifier.h
@@ -25,7 +25,7 @@
namespace clang {
namespace ast_matchers {
-enum Language { Lang_C, Lang_C89, Lang_CXX, Lang_OpenCL };
+enum Language { Lang_C, Lang_C89, Lang_CXX, Lang_CXX11, Lang_OpenCL };
/// \brief Base class for verifying some property of nodes found by a matcher.
template <typename NodeType>
@@ -85,6 +85,10 @@ testing::AssertionResult MatchVerifier<NodeType>::match(
Args.push_back("-std=c++98");
FileName = "input.cc";
break;
+ case Lang_CXX11:
+ Args.push_back("-std=c++11");
+ FileName = "input.cc";
+ break;
case Lang_OpenCL:
FileName = "input.cl";
}
diff --git a/clang/unittests/AST/SourceLocationTest.cpp b/clang/unittests/AST/SourceLocationTest.cpp
index be63085b8a5..697c6a04b75 100644
--- a/clang/unittests/AST/SourceLocationTest.cpp
+++ b/clang/unittests/AST/SourceLocationTest.cpp
@@ -201,5 +201,26 @@ TEST(UnaryTransformTypeLoc, ParensRange) {
loc(unaryTransformType())));
}
+TEST(CXXFunctionalCastExpr, SourceRange) {
+ RangeVerifier<CXXFunctionalCastExpr> Verifier;
+ Verifier.expectRange(2, 10, 2, 14);
+ EXPECT_TRUE(Verifier.match(
+ "int foo() {\n"
+ " return int{};\n"
+ "}",
+ functionalCastExpr(), Lang_CXX11));
+}
+
+TEST(CXXUnresolvedConstructExpr, SourceRange) {
+ RangeVerifier<CXXUnresolvedConstructExpr> Verifier;
+ Verifier.expectRange(3, 10, 3, 12);
+ EXPECT_TRUE(Verifier.match(
+ "template <typename U>\n"
+ "U foo() {\n"
+ " return U{};\n"
+ "}",
+ unresolvedConstructExpr(), Lang_CXX11));
+}
+
} // end namespace ast_matchers
} // end namespace clang
OpenPOWER on IntegriCloud