Author: Shivam Gupta Date: 2023-10-26T12:39:48+05:30 New Revision: 897cc8a7d7c0e47686322dbd4b95ecad30bb2298
URL: https://github.com/llvm/llvm-project/commit/897cc8a7d7c0e47686322dbd4b95ecad30bb2298 DIFF: https://github.com/llvm/llvm-project/commit/897cc8a7d7c0e47686322dbd4b95ecad30bb2298.diff LOG: [RecursiveASTVisitor] Fix RecursiveASTVisitor (RAV) fails to visit the initializer of a bitfield (#69557) The problem was introduced in the commit https://github.com/llvm/llvm-project/commit/6b8e3c02ca44fb6c3738bb0c75859c11a03e30ed when the possibility of initialized bitfields was added, but the logic in RecursiveASTVisitor was not updated. This PR fixed that. This fixes https://github.com/llvm/llvm-project/issues/64916. Patch by Scott McPeak --------- Co-authored-by: cor3ntin <corentinja...@gmail.com> Added: clang/unittests/Tooling/RecursiveASTVisitorTests/BitfieldInitializer.cpp Modified: clang/docs/ReleaseNotes.rst clang/include/clang/AST/RecursiveASTVisitor.h clang/unittests/Tooling/CMakeLists.txt Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 42f20b9a9bb0410..074116d2edf9f99 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -650,6 +650,9 @@ Bug Fixes to AST Handling `Issue 64170 <https://github.com/llvm/llvm-project/issues/64170>`_ - Fixed ``hasAnyBase`` not binding nodes in its submatcher. (`#65421 <https://github.com/llvm/llvm-project/issues/65421>`_) +- Fixed a bug where RecursiveASTVisitor fails to visit the + initializer of a bitfield. + `Issue 64916 <https://github.com/llvm/llvm-project/issues/64916>`_ Miscellaneous Bug Fixes ^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index 3dd23eb38eeabfc..53bc15e1b19f668 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 2fbe78e3fab7528..5a10a6b285390e9 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 000000000000000..c11e726fe855284 --- /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 <string> + +using namespace clang; + +namespace { + +// Check to ensure that bitfield initializers are visited. +class BitfieldInitializerVisitor + : public ExpectedLocationVisitor<BitfieldInitializerVisitor> { +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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits