https://github.com/ksromanov created https://github.com/llvm/llvm-project/pull/104540
Fixes #102945 >From 5c5f8496341e7b97faf62dad2ba7e0b210bde11b Mon Sep 17 00:00:00 2001 From: Konstantin Romanov <konstantinsroma...@gmail.com> Date: Fri, 9 Aug 2024 23:40:07 -0400 Subject: [PATCH] Workaround for cppcoreguidelines-pro-type-union-access if member location is invalid. --- .../cppcoreguidelines/ProTypeUnionAccessCheck.cpp | 8 ++++++-- .../checkers/cppcoreguidelines/pro-type-union-access.cpp | 7 +++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp index 1ed444e630ec25..0e9185956b7aa8 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp @@ -23,8 +23,12 @@ void ProTypeUnionAccessCheck::registerMatchers(MatchFinder *Finder) { void ProTypeUnionAccessCheck::check(const MatchFinder::MatchResult &Result) { const auto *Matched = Result.Nodes.getNodeAs<MemberExpr>("expr"); - diag(Matched->getMemberLoc(), - "do not access members of unions; use (boost::)variant instead"); + if (auto MemberLoc = Matched->getMemberLoc(); MemberLoc.isValid()) + diag(MemberLoc, + "do not access members of unions; use (boost::)variant instead"); + else + diag(Matched->getBeginLoc(), + "do not access members of unions; use (boost::)variant instead"); } } // namespace clang::tidy::cppcoreguidelines diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-type-union-access.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-type-union-access.cpp index 6abc22b9e4345e..46bb06ba2c8fbe 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-type-union-access.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/pro-type-union-access.cpp @@ -5,6 +5,10 @@ union U { char union_member2; } u; +union W { + template <class TP> operator TP *() const; +}; + struct S { int non_union_member; union { @@ -20,6 +24,7 @@ void f(char); void f2(U); void f3(U&); void f4(U*); +W f5(); void check() { @@ -38,4 +43,6 @@ void check() f2(u); // OK f3(u); // OK f4(&u); // OK + void *ret = f5(); + // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: do not access members of unions; use (boost::)variant instead } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits