Author: aaronballman Date: Fri Sep 4 13:34:48 2015 New Revision: 246860 URL: http://llvm.org/viewvc/llvm-project?rev=246860&view=rev Log: Fixing a bug where hasType(decl()) would fail to match on C code involving structs or unions.
Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h?rev=246860&r1=246859&r2=246860&view=diff ============================================================================== --- cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h (original) +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchersInternal.h Fri Sep 4 13:34:48 2015 @@ -668,16 +668,14 @@ private: return matchesDecl(Node.getDecl(), Finder, Builder); } - /// \brief Extracts the CXXRecordDecl or EnumDecl of a QualType and returns - /// whether the inner matcher matches on it. + /// \brief Extracts the TagDecl of a QualType and returns whether the inner + /// matcher matches on it. bool matchesSpecialized(const QualType &Node, ASTMatchFinder *Finder, BoundNodesTreeBuilder *Builder) const { /// FIXME: Add other ways to convert... if (Node.isNull()) return false; - if (const EnumType *AsEnum = dyn_cast<EnumType>(Node.getTypePtr())) - return matchesDecl(AsEnum->getDecl(), Finder, Builder); - return matchesDecl(Node->getAsCXXRecordDecl(), Finder, Builder); + return matchesDecl(Node->getAsTagDecl(), Finder, Builder); } /// \brief Gets the TemplateDecl from a TemplateSpecializationType Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp?rev=246860&r1=246859&r2=246860&view=diff ============================================================================== --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp (original) +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp Fri Sep 4 13:34:48 2015 @@ -919,6 +919,9 @@ TEST(TypeMatcher, MatchesClassType) { EXPECT_TRUE( matches("class A { public: A *a; class B {}; };", TypeAHasClassB)); + + EXPECT_TRUE(matchesC("struct S {}; void f(void) { struct S s; }", + varDecl(hasType(namedDecl(hasName("S")))))); } TEST(Matcher, BindMatchedNodes) { Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h?rev=246860&r1=246859&r2=246860&view=diff ============================================================================== --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h (original) +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.h Fri Sep 4 13:34:48 2015 @@ -120,6 +120,12 @@ testing::AssertionResult matchesObjC(con } template <typename T> +testing::AssertionResult matchesC(const std::string &Code, const T &AMatcher) { + return matchesConditionally(Code, AMatcher, true, "", FileContentMappings(), + "input.c"); +} + +template <typename T> testing::AssertionResult notMatchesObjC(const std::string &Code, const T &AMatcher) { return matchesConditionally( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits