diff --git a/clang/lib/AST/ASTStructuralEquivalence.cpp b/clang/lib/AST/ASTStructuralEquivalence.cpp --- a/clang/lib/AST/ASTStructuralEquivalence.cpp +++ b/clang/lib/AST/ASTStructuralEquivalence.cpp @@ -366,6 +366,10 @@ return true; } + bool IsStmtEquivalent(const CXXBoolLiteralExpr *E1, const CXXBoolLiteralExpr *E2) { + return E1->getValue() == E2->getValue(); + } + /// End point of the traversal chain. bool TraverseStmt(const Stmt *S1, const Stmt *S2) { return true; } diff --git a/clang/unittests/AST/StructuralEquivalenceTest.cpp b/clang/unittests/AST/StructuralEquivalenceTest.cpp --- a/clang/unittests/AST/StructuralEquivalenceTest.cpp +++ b/clang/unittests/AST/StructuralEquivalenceTest.cpp @@ -1798,6 +1798,25 @@ TU, cxxRecordDecl(hasName("B"), unless(isImplicit()))))); } +TEST_F(StructuralEquivalenceCacheTest, ReturnStmtNonEq) { + auto TU = makeTuDecls( + R"( + bool x(){ return true; } + )", + R"( + bool x(){ return false; } + )", + Lang_CXX03); + + StructuralEquivalenceContext Ctx( + get<0>(TU)->getASTContext(), get<1>(TU)->getASTContext(), + NonEquivalentDecls, StructuralEquivalenceKind::Default, false, false); + + auto X = findDeclPair(TU, functionDecl(hasName("x"))); + EXPECT_FALSE(Ctx.IsEquivalent(X.first->getBody(), X.second->getBody())); + +} + TEST_F(StructuralEquivalenceCacheTest, SpecialNonEq) { auto TU = makeTuDecls( R"(