summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Kornienko <alexfh@google.com>2019-03-05 14:09:57 +0000
committerAlexander Kornienko <alexfh@google.com>2019-03-05 14:09:57 +0000
commit401997db928eb5aff56b8daaf4cd676e102b05d7 (patch)
treee09cf5a3ce7902ad96e789f894e6662ac87e72c2
parent4d93b9c75c0452674ad451256c7225fb86da5e87 (diff)
downloadbcm5719-llvm-401997db928eb5aff56b8daaf4cd676e102b05d7.tar.gz
bcm5719-llvm-401997db928eb5aff56b8daaf4cd676e102b05d7.zip
[clang-tidy] Fix bugprone-string-constructor crash
llvm-svn: 355401
-rw-r--r--clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp3
-rw-r--r--clang-tools-extra/test/clang-tidy/bugprone-string-constructor.cpp8
2 files changed, 10 insertions, 1 deletions
diff --git a/clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp
index 3a4e75bcda8..a4b83ada98d 100644
--- a/clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/StringConstructorCheck.cpp
@@ -138,7 +138,8 @@ void StringConstructorCheck::check(const MatchFinder::MatchResult &Result) {
}
} else if (const auto *Ptr = Result.Nodes.getNodeAs<Expr>("from-ptr")) {
Expr::EvalResult ConstPtr;
- if (Ptr->EvaluateAsRValue(ConstPtr, Ctx) &&
+ if (!Ptr->isInstantiationDependent() &&
+ Ptr->EvaluateAsRValue(ConstPtr, Ctx) &&
((ConstPtr.Val.isInt() && ConstPtr.Val.getInt().isNullValue()) ||
(ConstPtr.Val.isLValue() && ConstPtr.Val.isNullPointer()))) {
diag(Loc, "constructing string from nullptr is undefined behaviour");
diff --git a/clang-tools-extra/test/clang-tidy/bugprone-string-constructor.cpp b/clang-tools-extra/test/clang-tidy/bugprone-string-constructor.cpp
index 3ab4f424087..9e11a32a018 100644
--- a/clang-tools-extra/test/clang-tidy/bugprone-string-constructor.cpp
+++ b/clang-tools-extra/test/clang-tidy/bugprone-string-constructor.cpp
@@ -65,3 +65,11 @@ void Valid() {
std::string s2("test", 3);
std::string s3("test");
}
+
+namespace instantiation_dependent_exprs {
+template<typename T>
+struct S {
+ bool x;
+ std::string f() { return x ? "a" : "b"; }
+};
+}
OpenPOWER on IntegriCloud