[clang] [clang][Sema] Fix particular operator overload crash (PR #105976)
Nicolas van Kempen via cfe-commits
cfe-commits at lists.llvm.org
Sat Aug 24 23:59:24 PDT 2024
https://github.com/nicovank updated https://github.com/llvm/llvm-project/pull/105976
>From 033d4003154440fb00c62c0e85fe3dac4af10d22 Mon Sep 17 00:00:00 2001
From: Nicolas van Kempen <nvankemp at gmail.com>
Date: Sun, 25 Aug 2024 02:57:55 -0400
Subject: [PATCH] [clang][Sema] Fix particular operator overload crash
Fix #104883.
Fix #104800.
---
clang/lib/Sema/SemaOverload.cpp | 7 +++++++
clang/test/SemaCXX/PR105976.cpp | 26 ++++++++++++++++++++++++++
2 files changed, 33 insertions(+)
create mode 100644 clang/test/SemaCXX/PR105976.cpp
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 1ce0fa091938d7..a2cf334bd176fe 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -7425,6 +7425,13 @@ void Sema::AddMethodCandidate(DeclAccessPair FoundDecl, QualType ObjectType,
/*ExplicitArgs*/ nullptr, ObjectType,
ObjectClassification, Args, CandidateSet,
SuppressUserConversions, false, PO);
+ } else if (UsingDecl *UD = dyn_cast<UsingDecl>(Decl)) {
+ for (auto *Shadow : UD->shadows()) {
+ AddMethodCandidate(cast<CXXMethodDecl>(Shadow->getTargetDecl()),
+ FoundDecl, ActingContext, ObjectType,
+ ObjectClassification, Args, CandidateSet,
+ SuppressUserConversions, false, std::nullopt, PO);
+ }
} else {
AddMethodCandidate(cast<CXXMethodDecl>(Decl), FoundDecl, ActingContext,
ObjectType, ObjectClassification, Args, CandidateSet,
diff --git a/clang/test/SemaCXX/PR105976.cpp b/clang/test/SemaCXX/PR105976.cpp
new file mode 100644
index 00000000000000..289e53058d6095
--- /dev/null
+++ b/clang/test/SemaCXX/PR105976.cpp
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -verify-ignore-unexpected=note %s
+
+struct B {
+ void operator==(B);
+};
+
+struct C {
+ void operator==(C);
+};
+
+struct D {
+ void operator==(D);
+};
+
+struct E : C, B {
+ using C::operator==;
+ using B::operator==;
+};
+
+struct F : D, E {};
+
+void f() {
+ F{} == F{};
+ // expected-error at -1 {{member 'operator==' found in multiple base classes of different types}}
+ // expected-error at -2 {{use of overloaded operator '==' is ambiguous}}
+}
More information about the cfe-commits
mailing list