diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 42f20b9a9bb04..074116d2edf9f 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -650,6 +650,9 @@ Bug Fixes to AST Handling `Issue 64170 `_ - Fixed ``hasAnyBase`` not binding nodes in its submatcher. (`#65421 `_) +- Fixed a bug where RecursiveASTVisitor fails to visit the + initializer of a bitfield. + `Issue 64916 `_ Miscellaneous Bug Fixes ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index 3dd23eb38eeab..53bc15e1b19f6 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -2103,7 +2103,7 @@ DEF_TRAVERSE_DECL(FieldDecl, { TRY_TO(TraverseDeclaratorHelper(D)); if (D->isBitField()) TRY_TO(TraverseStmt(D->getBitWidth())); - else if (D->hasInClassInitializer()) + if (D->hasInClassInitializer()) TRY_TO(TraverseStmt(D->getInClassInitializer())); }) diff --git a/clang/unittests/Tooling/CMakeLists.txt b/clang/unittests/Tooling/CMakeLists.txt index 2fbe78e3fab75..5a10a6b285390 100644 --- a/clang/unittests/Tooling/CMakeLists.txt +++ b/clang/unittests/Tooling/CMakeLists.txt @@ -25,6 +25,7 @@ add_clang_unittest(ToolingTests QualTypeNamesTest.cpp RangeSelectorTest.cpp RecursiveASTVisitorTests/Attr.cpp + RecursiveASTVisitorTests/BitfieldInitializer.cpp RecursiveASTVisitorTests/CallbacksLeaf.cpp RecursiveASTVisitorTests/CallbacksUnaryOperator.cpp RecursiveASTVisitorTests/CallbacksBinaryOperator.cpp diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/BitfieldInitializer.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/BitfieldInitializer.cpp new file mode 100644 index 0000000000000..c11e726fe8552 --- /dev/null +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/BitfieldInitializer.cpp @@ -0,0 +1,34 @@ +//===- unittest/Tooling/RecursiveASTVisitorTests/BitfieldInitializer.cpp -===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "TestVisitor.h" +#include + +using namespace clang; + +namespace { + +// Check to ensure that bitfield initializers are visited. +class BitfieldInitializerVisitor + : public ExpectedLocationVisitor { +public: + bool VisitIntegerLiteral(IntegerLiteral *IL) { + Match(std::to_string(IL->getValue().getSExtValue()), IL->getLocation()); + return true; + } +}; + +TEST(RecursiveASTVisitor, BitfieldInitializerIsVisited) { + BitfieldInitializerVisitor Visitor; + Visitor.ExpectMatch("123", 2, 15); + EXPECT_TRUE(Visitor.runOver("struct S {\n" + " int x : 8 = 123;\n" + "};\n")); +} + +} // end anonymous namespace