forked from OSchip/llvm-project
[analyzer] Fix nullptr access when processing instantiated function in ExprMutationAnalyzer.
llvm-svn: 342562
This commit is contained in:
parent
c33b2e6d0f
commit
86e5cb0e0b
|
@ -379,7 +379,7 @@ const Stmt *ExprMutationAnalyzer::findFunctionArgMutation(const Expr *Exp) {
|
||||||
for (const auto &Nodes : Matches) {
|
for (const auto &Nodes : Matches) {
|
||||||
const auto *Exp = Nodes.getNodeAs<Expr>(NodeID<Expr>::value);
|
const auto *Exp = Nodes.getNodeAs<Expr>(NodeID<Expr>::value);
|
||||||
const auto *Func = Nodes.getNodeAs<FunctionDecl>("func");
|
const auto *Func = Nodes.getNodeAs<FunctionDecl>("func");
|
||||||
if (!Func->getBody())
|
if (!Func->getBody() || !Func->getPrimaryTemplate())
|
||||||
return Exp;
|
return Exp;
|
||||||
|
|
||||||
const auto *Parm = Nodes.getNodeAs<ParmVarDecl>("parm");
|
const auto *Parm = Nodes.getNodeAs<ParmVarDecl>("parm");
|
||||||
|
|
|
@ -215,6 +215,12 @@ TEST(ExprMutationAnalyzerTest, ByValueArgument) {
|
||||||
"void f() { A x, y; y = x; }");
|
"void f() { A x, y; y = x; }");
|
||||||
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
EXPECT_FALSE(isMutated(Results, AST.get()));
|
EXPECT_FALSE(isMutated(Results, AST.get()));
|
||||||
|
|
||||||
|
AST = buildASTFromCode(
|
||||||
|
"template <int> struct A { A(); A(const A&); static void mf(A) {} };"
|
||||||
|
"void f() { A<0> x; A<0>::mf(x); }");
|
||||||
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
|
EXPECT_FALSE(isMutated(Results, AST.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(ExprMutationAnalyzerTest, ByConstValueArgument) {
|
TEST(ExprMutationAnalyzerTest, ByConstValueArgument) {
|
||||||
|
@ -241,6 +247,12 @@ TEST(ExprMutationAnalyzerTest, ByConstValueArgument) {
|
||||||
"void f() { struct A { A(const int); }; int x; A y(x); }");
|
"void f() { struct A { A(const int); }; int x; A y(x); }");
|
||||||
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
EXPECT_FALSE(isMutated(Results, AST.get()));
|
EXPECT_FALSE(isMutated(Results, AST.get()));
|
||||||
|
|
||||||
|
AST = buildASTFromCode("template <int> struct A { A(); A(const A&);"
|
||||||
|
"static void mf(const A&) {} };"
|
||||||
|
"void f() { A<0> x; A<0>::mf(x); }");
|
||||||
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
|
EXPECT_FALSE(isMutated(Results, AST.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(ExprMutationAnalyzerTest, ByNonConstRefArgument) {
|
TEST(ExprMutationAnalyzerTest, ByNonConstRefArgument) {
|
||||||
|
@ -288,6 +300,12 @@ TEST(ExprMutationAnalyzerTest, ByNonConstRefArgument) {
|
||||||
AST = buildASTFromCode("void f() { struct A { A(); A(A&); }; A x; A y(x); }");
|
AST = buildASTFromCode("void f() { struct A { A(); A(A&); }; A x; A y(x); }");
|
||||||
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre("x"));
|
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre("x"));
|
||||||
|
|
||||||
|
AST = buildASTFromCode(
|
||||||
|
"template <int> struct A { A(); A(const A&); static void mf(A&) {} };"
|
||||||
|
"void f() { A<0> x; A<0>::mf(x); }");
|
||||||
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
|
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre("A<0>::mf(x)"));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(ExprMutationAnalyzerTest, ByConstRefArgument) {
|
TEST(ExprMutationAnalyzerTest, ByConstRefArgument) {
|
||||||
|
@ -686,6 +704,12 @@ TEST(ExprMutationAnalyzerTest, FollowFuncArgModified) {
|
||||||
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre("x"));
|
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre("x"));
|
||||||
|
|
||||||
|
AST = buildASTFromCode("template <class U> struct S {"
|
||||||
|
"template <class T> S(T&& t) : m(++t) { } U m; };"
|
||||||
|
"void f() { int x; S<int> s(x); }");
|
||||||
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
|
EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre("x"));
|
||||||
|
|
||||||
AST = buildASTFromCode(StdRemoveReference + StdForward +
|
AST = buildASTFromCode(StdRemoveReference + StdForward +
|
||||||
"template <class... Args> void u(Args&...);"
|
"template <class... Args> void u(Args&...);"
|
||||||
"template <class... Args> void h(Args&&... args)"
|
"template <class... Args> void h(Args&&... args)"
|
||||||
|
@ -737,6 +761,12 @@ TEST(ExprMutationAnalyzerTest, FollowFuncArgNotModified) {
|
||||||
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
EXPECT_FALSE(isMutated(Results, AST.get()));
|
EXPECT_FALSE(isMutated(Results, AST.get()));
|
||||||
|
|
||||||
|
AST = buildASTFromCode("template <class U> struct S {"
|
||||||
|
"template <class T> S(T&& t) : m(t) { } U m; };"
|
||||||
|
"void f() { int x; S<int> s(x); }");
|
||||||
|
Results = match(withEnclosingCompound(declRefTo("x")), AST->getASTContext());
|
||||||
|
EXPECT_FALSE(isMutated(Results, AST.get()));
|
||||||
|
|
||||||
AST = buildASTFromCode(StdRemoveReference + StdForward +
|
AST = buildASTFromCode(StdRemoveReference + StdForward +
|
||||||
"template <class... Args> void u(Args...);"
|
"template <class... Args> void u(Args...);"
|
||||||
"template <class... Args> void h(Args&&... args)"
|
"template <class... Args> void h(Args&&... args)"
|
||||||
|
|
Loading…
Reference in New Issue