Skip to content

[clang-tidy][NFC] fix compilation by disambiguating equality operator #147048

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

gjasny
Copy link

@gjasny gjasny commented Jul 4, 2025

This fixes an issue compiling LLVM 20.1.7 on Ubuntu 22.04 with the Ubuntu provided Clang 14 and C++20. That's probably happening due to incomplete C++20 support in either Clang 14 or the GNU libstdc++ 12.

The actual error is:

[1/8] Building CXX object tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o
FAILED: tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o
/usr/lib/llvm-14/bin/clang++ -DGTEST_HAS_RTTI=0 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/gregorj/Git/el/libclang/_build_cxx20_clang14_r/LocalLLVM-prefix/src/LocalLLVM-build/tools/clang/tools/extra/clang-tidy/bugprone -I/home/gregorj/Git/el/libclang/llvm-project/clang-tools-extra/clang-tidy/bugprone -I/home/gregorj/Git/el/libclang/_build_cxx20_clang14_r/LocalLLVM-prefix/src/LocalLLVM-build/tools/clang/tools/extra/clang-tidy -I/home/gregorj/Git/el/libclang/llvm-project/clang/include -I/home/gregorj/Git/el/libclang/_build_cxx20_clang14_r/LocalLLVM-prefix/src/LocalLLVM-build/tools/clang/include -I/home/gregorj/Git/el/libclang/_build_cxx20_clang14_r/LocalLLVM-prefix/src/LocalLLVM-build/include -I/home/gregorj/Git/el/libclang/llvm-project/llvm/include -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++20  -fno-exceptions -funwind-tables -fno-rtti -MD -MT tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o -MF tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o.d -o tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o -c /home/gregorj/Git/el/libclang/llvm-project/clang-tools-extra/clang-tidy/bugprone/TaggedUnionMemberCountCheck.cpp
/home/gregorj/Git/el/libclang/llvm-project/clang-tools-extra/clang-tidy/bugprone/TaggedUnionMemberCountCheck.cpp:148:39: error: use of overloaded operator '==' is ambiguous (with operand types 'llvm::APSInt' and 'unsigned long')
      (LastEnumConstant->getInitVal() == (EnumValues.size() - 1))) {
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~
/home/gregorj/Git/el/libclang/llvm-project/llvm/include/llvm/ADT/APInt.h:2080:13: note: candidate function (with reversed parameter order)
inline bool operator==(uint64_t V1, const APInt &V2) { return V2 == V1; }
            ^
/home/gregorj/Git/el/libclang/llvm-project/llvm/include/llvm/ADT/APSInt.h:188:8: note: candidate function
  bool operator==(int64_t RHS) const {
       ^
/home/gregorj/Git/el/libclang/llvm-project/llvm/include/llvm/ADT/APSInt.h:357:13: note: candidate function (with reversed parameter order)
inline bool operator==(int64_t V1, const APSInt &V2) { return V2 == V1; }
            ^
1 error generated.

I know that clang-14 in combination with the GNU libstdc++ 12 might not be 100% C++20 compliant. But this is the only error we see when compiling LLVM 20.1.7 and it looks very fixable. Would it be possible to cherry-pick the fix to the release/20.x branch?

Thanks,
Gregor

Copy link

github-actions bot commented Jul 4, 2025

Thank you for submitting a Pull Request (PR) to the LLVM Project!

This PR will be automatically labeled and the relevant teams will be notified.

If you wish to, you can add reviewers by using the "Reviewers" section on this page.

If this is not working for you, it is probably because you do not have write permissions for the repository. In which case you can instead tag reviewers by name in a comment by using @ followed by their GitHub username.

If you have received no comments on your PR for a week, you can request a review by "ping"ing the PR by adding a comment “Ping”. The common courtesy "ping" rate is once a week. Please remember that you are asking for valuable time from other developers.

If you have further questions, they may be answered by the LLVM GitHub User Guide.

You can also ask questions in a comment on this PR, on the LLVM Discord or on the forums.

@llvmbot
Copy link
Member

llvmbot commented Jul 4, 2025

@llvm/pr-subscribers-clang-tools-extra

@llvm/pr-subscribers-clang-tidy

Author: Gregor Jasny (gjasny)

Changes

This fixes an issue compiling LLVM 20.1.7 on Ubuntu 22.04 with the Ubuntu provided Clang 14 and C++20. That's probably happening due to incomplete C++20 support in either Clang 14 or the GNU libstdc++ 12.

The actual error is:

[1/8] Building CXX object tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o
FAILED: tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o
/usr/lib/llvm-14/bin/clang++ -DGTEST_HAS_RTTI=0 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/home/gregorj/Git/el/libclang/_build_cxx20_clang14_r/LocalLLVM-prefix/src/LocalLLVM-build/tools/clang/tools/extra/clang-tidy/bugprone -I/home/gregorj/Git/el/libclang/llvm-project/clang-tools-extra/clang-tidy/bugprone -I/home/gregorj/Git/el/libclang/_build_cxx20_clang14_r/LocalLLVM-prefix/src/LocalLLVM-build/tools/clang/tools/extra/clang-tidy -I/home/gregorj/Git/el/libclang/llvm-project/clang/include -I/home/gregorj/Git/el/libclang/_build_cxx20_clang14_r/LocalLLVM-prefix/src/LocalLLVM-build/tools/clang/include -I/home/gregorj/Git/el/libclang/_build_cxx20_clang14_r/LocalLLVM-prefix/src/LocalLLVM-build/include -I/home/gregorj/Git/el/libclang/llvm-project/llvm/include -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types -O3 -DNDEBUG -std=c++20  -fno-exceptions -funwind-tables -fno-rtti -MD -MT tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o -MF tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o.d -o tools/clang/tools/extra/clang-tidy/bugprone/CMakeFiles/obj.clangTidyBugproneModule.dir/TaggedUnionMemberCountCheck.cpp.o -c /home/gregorj/Git/el/libclang/llvm-project/clang-tools-extra/clang-tidy/bugprone/TaggedUnionMemberCountCheck.cpp
/home/gregorj/Git/el/libclang/llvm-project/clang-tools-extra/clang-tidy/bugprone/TaggedUnionMemberCountCheck.cpp:148:39: error: use of overloaded operator '==' is ambiguous (with operand types 'llvm::APSInt' and 'unsigned long')
      (LastEnumConstant->getInitVal() == (EnumValues.size() - 1))) {
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~~~~~
/home/gregorj/Git/el/libclang/llvm-project/llvm/include/llvm/ADT/APInt.h:2080:13: note: candidate function (with reversed parameter order)
inline bool operator==(uint64_t V1, const APInt &V2) { return V2 == V1; }
            ^
/home/gregorj/Git/el/libclang/llvm-project/llvm/include/llvm/ADT/APSInt.h:188:8: note: candidate function
  bool operator==(int64_t RHS) const {
       ^
/home/gregorj/Git/el/libclang/llvm-project/llvm/include/llvm/ADT/APSInt.h:357:13: note: candidate function (with reversed parameter order)
inline bool operator==(int64_t V1, const APSInt &V2) { return V2 == V1; }
            ^
1 error generated.

I know that clang-14 in combination with the GNU libstdc++ 12 might not be 100% C++20 compliant. But this is the only error we see when compiling LLVM 20.1.7 and it looks very fixable. Would it be possible to cherry-pick the fix to the release/20.x branch?

Thanks,
Gregor


Full diff: https://github.com/llvm/llvm-project/pull/147048.diff

1 Files Affected:

  • (modified) clang-tools-extra/clang-tidy/bugprone/TaggedUnionMemberCountCheck.cpp (+1-1)
diff --git a/clang-tools-extra/clang-tidy/bugprone/TaggedUnionMemberCountCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/TaggedUnionMemberCountCheck.cpp
index db0ac281ddfcf..7a4d43fc49320 100644
--- a/clang-tools-extra/clang-tidy/bugprone/TaggedUnionMemberCountCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/TaggedUnionMemberCountCheck.cpp
@@ -144,7 +144,7 @@ TaggedUnionMemberCountCheck::getNumberOfEnumValues(const EnumDecl *ED) {
 
   if (EnableCountingEnumHeuristic && LastEnumConstant &&
       isCountingEnumLikeName(LastEnumConstant->getName()) &&
-      (LastEnumConstant->getInitVal() == (EnumValues.size() - 1))) {
+      (LastEnumConstant->getInitVal() == llvm::APSInt::getUnsigned(EnumValues.size() - 1u))) {
     return {EnumValues.size() - 1, LastEnumConstant};
   }
 

Copy link

github-actions bot commented Jul 4, 2025

✅ With the latest revision this PR passed the C/C++ code formatter.

@gjasny gjasny force-pushed the bugfix/gjasny/fix-ubuntu2204-clang14-cxx20 branch from 7452d3c to 2585b9c Compare July 4, 2025 13:01
@gjasny gjasny force-pushed the bugfix/gjasny/fix-ubuntu2204-clang14-cxx20 branch from 2585b9c to df2f97d Compare July 4, 2025 13:30
@vbvictor
Copy link
Contributor

vbvictor commented Jul 4, 2025

That's probably happening due to incomplete C++20 support in either Clang 14 or the GNU libstdc++ 12.

Current standard that LLVM use is c++17. But we generally should support compilers at least 3 years of compilers.

Would it be possible to cherry-pick the fix to the release/20.x branch?

I don't have much knowledge on cherry-picking to release, but the latest release of 20.x could be on Jul 8th (if it even happens, see https://llvm.org/). I have a slight feeling that it's not worth cherry-picking, If LLVM is compiled from source, would it be feasible to just use 21st LLVM branch that will be released soon, gjasny?

@vbvictor vbvictor changed the title [clang-tidy] fix compilation by disambiguating equality operator [clang-tidy][NFC] fix compilation by disambiguating equality operator Jul 4, 2025
@EugeneZelenko EugeneZelenko requested a review from PiotrZSL July 4, 2025 14:56
@5chmidti
Copy link
Contributor

5chmidti commented Jul 4, 2025

That's probably happening due to incomplete C++20 support in either Clang 14 or the GNU libstdc++ 12.

Current standard that LLVM use is c++17. But we generally should support compilers at least 3 years of compilers.

Correct, but we also want to support being able to compile with C++20. I think there are build bots for that set up.

Would it be possible to cherry-pick the fix to the release/20.x branch?

I don't have much knowledge on cherry-picking to release, but the latest release of 20.x could be on Jul 8th (if it even happens, see https://llvm.org/). I have a slight feeling that it's not worth cherry-picking, If LLVM is compiled from source, would it be feasible to just use 21st LLVM branch that will be released soon, gjasny?

The compile error is in a cpp file, so it would only happen to people compiling the clang-tidy libs with C++20 which has an even smaller chance of happening, but still. IMO this should just go into LLVM 20, it's a trivial fix.

@vbvictor
Copy link
Contributor

vbvictor commented Jul 4, 2025

IMO this should just go into LLVM 20, it's a trivial fix.

I don't oppose, then just note that we don't have much time till 20th final release.

This fixes a compilation issue on Ubuntu 22.04 with the Ubuntu
provided Clang 14 and C++20. That's probably happening due to
incomplete C++20 support in either Clang 14 or the GNU libstdc++ 12.

Signed-off-by: Gregor Jasny <[email protected]>
@gjasny gjasny force-pushed the bugfix/gjasny/fix-ubuntu2204-clang14-cxx20 branch from df2f97d to f1ff857 Compare July 7, 2025 08:17
@gjasny
Copy link
Author

gjasny commented Jul 7, 2025

All builds are green, now.

@@ -144,7 +144,9 @@ TaggedUnionMemberCountCheck::getNumberOfEnumValues(const EnumDecl *ED) {

if (EnableCountingEnumHeuristic && LastEnumConstant &&
isCountingEnumLikeName(LastEnumConstant->getName()) &&
(LastEnumConstant->getInitVal() == (EnumValues.size() - 1))) {
llvm::APSInt::compareValues(LastEnumConstant->getInitVal(),
Copy link
Contributor

@vbvictor vbvictor Jul 7, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could use llvm::APSInt::isSameValue to avoid strange formatting

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants