[clang] [Clang][Sema] Fix crash in UnresolvedMemberExpr check (PR #209792)

Chibuoyim Ogbonna via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 17 01:56:58 PDT 2026


https://github.com/bruteforceboy updated https://github.com/llvm/llvm-project/pull/209792

>From b8cf3a536eb9879f591e82efeb1cb2e7f95817b1 Mon Sep 17 00:00:00 2001
From: workwilson <ogbonnachibuoyim12 at gmail.com>
Date: Wed, 15 Jul 2026 23:16:19 +0800
Subject: [PATCH 1/2] [Clang][Sema] Fix crash in UnresolvedMemberExpr check

---
 clang/lib/AST/ExprCXX.cpp                   |  5 ++---
 clang/test/SemaCXX/using-decl-templates.cpp | 11 +++++++++++
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp
index a1ea91994969c..6c1cde6540d85 100644
--- a/clang/lib/AST/ExprCXX.cpp
+++ b/clang/lib/AST/ExprCXX.cpp
@@ -1602,14 +1602,13 @@ CXXThisExpr *CXXThisExpr::CreateEmpty(const ASTContext &Ctx) {
 static bool hasOnlyNonStaticMemberFunctions(UnresolvedSetIterator begin,
                                             UnresolvedSetIterator end) {
   do {
-    NamedDecl *decl = *begin;
+    NamedDecl *decl = (*begin)->getUnderlyingDecl();
     if (isa<UnresolvedUsingValueDecl>(decl))
       return false;
 
     // Unresolved member expressions should only contain methods and
     // method templates.
-    if (cast<CXXMethodDecl>(decl->getUnderlyingDecl()->getAsFunction())
-            ->isStatic())
+    if (cast<CXXMethodDecl>(decl->getAsFunction())->isStatic())
       return false;
   } while (++begin != end);
 
diff --git a/clang/test/SemaCXX/using-decl-templates.cpp b/clang/test/SemaCXX/using-decl-templates.cpp
index 58b30595b148c..a1a9b7ba0c31d 100644
--- a/clang/test/SemaCXX/using-decl-templates.cpp
+++ b/clang/test/SemaCXX/using-decl-templates.cpp
@@ -64,6 +64,17 @@ template <class T> struct Bar : public Foo<T>, Baz {
 template int Bar<int>::foo();
 }
 
+namespace CrashOnInvalidUsingShadow {
+template <class T> struct BaseTpl {};
+template <class T> struct Derived : public BaseTpl<T>, Derivd { // expected-error {{expected class name}} expected-note {{'Derived' declared here}}
+  using BaseTpl<T>::k;
+  using Derivd::k; // expected-error {{use of undeclared identifier 'Derivd'; did you mean 'Derived'?}}
+  int foo() {
+    return k(1.0f);
+  }
+};
+} // namespace CrashOnInvalidUsingShadow
+
 // PR10883
 namespace PR10883 {
   template <typename T>

>From cb49fb288c42b66c07b4f1af94fbee194df0dde2 Mon Sep 17 00:00:00 2001
From: workwilson <ogbonnachibuoyim12 at gmail.com>
Date: Thu, 16 Jul 2026 16:33:40 +0800
Subject: [PATCH 2/2] [Clang][Sema] Add release note for UnresolvedMemberExpr
 crash fix

---
 clang/docs/ReleaseNotes.md | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 760c973eb6a73..f1f9d8a1c7e20 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -136,6 +136,9 @@ latest release, please see the [Clang Web Site](https://clang.llvm.org) or the
 
 #### Bug Fixes to C++ Support
 
+- Fixed a crash when a using-declaration naming an unresolvable member of a
+  dependent base was shadowed by an invalid using-declaration. (#GH209427)
+
 #### Bug Fixes to AST Handling
 
 #### Miscellaneous Bug Fixes



More information about the cfe-commits mailing list