[clang-tools-extra] [clang-tidy] Workaround for cppcoreguidelines-pro-type-union-access if memLoc is invalid (PR #104540)
Konstantin Romanov via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 16 11:04:12 PDT 2024
https://github.com/ksromanov updated https://github.com/llvm/llvm-project/pull/104540
>From 47db38f62940e6bca72a51f519a5b78da25a38c2 Mon Sep 17 00:00:00 2001
From: Konstantin Romanov <konstantinsromanov at gmail.com>
Date: Fri, 9 Aug 2024 23:40:07 -0400
Subject: [PATCH 1/4] 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
}
>From 933219ac6c8c6608bf338c85b05fd756b100342c Mon Sep 17 00:00:00 2001
From: Konstantin Romanov <konstantinsromanov at gmail.com>
Date: Fri, 16 Aug 2024 12:35:30 -0400
Subject: [PATCH 2/4] Update
clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp
Co-authored-by: Piotr Zegar <me at piotrzegar.pl>
---
.../cppcoreguidelines/ProTypeUnionAccessCheck.cpp | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp
index 0e9185956b7aa8..a5b8d1e9a1696c 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp
@@ -23,12 +23,10 @@ void ProTypeUnionAccessCheck::registerMatchers(MatchFinder *Finder) {
void ProTypeUnionAccessCheck::check(const MatchFinder::MatchResult &Result) {
const auto *Matched = Result.Nodes.getNodeAs<MemberExpr>("expr");
- 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");
+ SourceLocation Loc = Matched->getMemberLoc();
+ if (Loc.isInvalid())
+ Loc = Matched->getBeginLoc();
+ diag(Loc, "do not access members of unions; use (boost::)variant instead");
}
} // namespace clang::tidy::cppcoreguidelines
>From 1a2dae46c383f28a9bcb8ca4fa09c6cc4921e7d4 Mon Sep 17 00:00:00 2001
From: Konstantin Romanov <konstantinsromanov at gmail.com>
Date: Fri, 16 Aug 2024 12:37:07 -0400
Subject: [PATCH 3/4] Address comments.
---
.../clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp
index a5b8d1e9a1696c..c29c4eb60f9d1a 100644
--- a/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp
+++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/ProTypeUnionAccessCheck.cpp
@@ -25,8 +25,9 @@ void ProTypeUnionAccessCheck::check(const MatchFinder::MatchResult &Result) {
const auto *Matched = Result.Nodes.getNodeAs<MemberExpr>("expr");
SourceLocation Loc = Matched->getMemberLoc();
if (Loc.isInvalid())
- Loc = Matched->getBeginLoc();
- diag(Loc, "do not access members of unions; use (boost::)variant instead");
+ Loc = Matched->getBeginLoc();
+ diag(Loc, "do not access members of unions; consider using (boost::)variant "
+ "instead");
}
} // namespace clang::tidy::cppcoreguidelines
>From 8f07de0d4f19d832edd0d46defc84828703db55f Mon Sep 17 00:00:00 2001
From: Konstantin Romanov <konstantinsromanov at gmail.com>
Date: Fri, 16 Aug 2024 14:03:53 -0400
Subject: [PATCH 4/4] Update test.
---
.../cppcoreguidelines/pro-type-union-access.cpp | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
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 46bb06ba2c8fbe..2823d38c9b69e4 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
@@ -29,13 +29,13 @@ W f5();
void check()
{
u.union_member1 = true;
- // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not access members of unions; use (boost::)variant instead [cppcoreguidelines-pro-type-union-access]
+ // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not access members of unions; consider using (boost::)variant instead [cppcoreguidelines-pro-type-union-access]
auto b = u.union_member2;
- // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: do not access members of unions; use (boost::)variant instead
+ // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: do not access members of unions; consider using (boost::)variant instead
auto a = &s.union_member;
- // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: do not access members of unions; use (boost::)variant instead
+ // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: do not access members of unions; consider using (boost::)variant instead
f(s.u.union_member2);
- // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not access members of unions; use (boost::)variant instead
+ // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: do not access members of unions; consider using (boost::)variant instead
s.non_union_member = 2; // OK
@@ -44,5 +44,5 @@ void check()
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
+ // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: do not access members of unions; consider using (boost::)variant instead
}
More information about the cfe-commits
mailing list