[clang] 32d03f3 - [Clang][Sema] Fix crash in CheckUsingDeclQualifier due to diagnostic missing an argument (#161277)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 2 08:20:15 PDT 2025
Author: Shafik Yaghmour
Date: 2025-10-02T08:20:09-07:00
New Revision: 32d03f3991bb03e976a25a3fa311f9a4e172dc5e
URL: https://github.com/llvm/llvm-project/commit/32d03f3991bb03e976a25a3fa311f9a4e172dc5e
DIFF: https://github.com/llvm/llvm-project/commit/32d03f3991bb03e976a25a3fa311f9a4e172dc5e.diff
LOG: [Clang][Sema] Fix crash in CheckUsingDeclQualifier due to diagnostic missing an argument (#161277)
Crash report came in and it was pretty obvious the diagnostic line was
just missing an argument. I supplied the argument and added a test.
Fixes: https://github.com/llvm/llvm-project/issues/161072
Added:
Modified:
clang/lib/Sema/SemaDeclCXX.cpp
clang/test/SemaCXX/cxx98-compat.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 1131e1f033b72..16d42d27d3b4e 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -13660,7 +13660,7 @@ bool Sema::CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
if (Cxx20Enumerator) {
Diag(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator)
- << SS.getRange();
+ << SS.getScopeRep() << SS.getRange();
return false;
}
diff --git a/clang/test/SemaCXX/cxx98-compat.cpp b/clang/test/SemaCXX/cxx98-compat.cpp
index 8e7acf73923e5..587c242271a02 100644
--- a/clang/test/SemaCXX/cxx98-compat.cpp
+++ b/clang/test/SemaCXX/cxx98-compat.cpp
@@ -1,6 +1,7 @@
-// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wc++98-compat -verify %s
-// RUN: %clang_cc1 -fsyntax-only -std=c++14 -Wc++98-compat -verify %s -DCXX14COMPAT
-// RUN: %clang_cc1 -fsyntax-only -std=c++17 -Wc++98-compat -verify %s -DCXX14COMPAT -DCXX17COMPAT
+// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wc++98-compat -verify=expected,not-cpp20 %s
+// RUN: %clang_cc1 -fsyntax-only -std=c++14 -Wc++98-compat -verify=expected,not-cpp20 %s -DCXX14COMPAT
+// RUN: %clang_cc1 -fsyntax-only -std=c++17 -Wc++98-compat -verify=expected,not-cpp20 %s -DCXX14COMPAT -DCXX17COMPAT
+// RUN: %clang_cc1 -fsyntax-only -std=c++20 -Wc++98-compat -verify=expected,cpp20 %s -DCXX14COMPAT -DCXX17COMPAT
namespace std {
struct type_info;
@@ -226,7 +227,8 @@ void TrivialButNonPODThroughEllipsis() {
}
struct HasExplicitConversion {
- explicit operator bool(); // expected-warning {{explicit conversion functions are incompatible with C++98}}
+ // FIXME I think we should generate this diagnostic in C++20
+ explicit operator bool(); // not-cpp20-warning {{explicit conversion functions are incompatible with C++98}}
};
struct Struct {};
@@ -430,3 +432,12 @@ void ctad_test() {
CTAD t = s; // expected-warning {{class template argument deduction is incompatible with C++ standards before C++17}}
}
#endif
+
+namespace GH161702 {
+struct S {
+ enum E { A };
+ using E::A; // expected-warning {{enumeration type in nested name specifier is incompatible with C++98}}
+ // not-cpp20-error at -1 {{using declaration refers to its own class}}
+ // cpp20-warning at -2 {{member using declaration naming non-class ''E'' enumerator is incompatible with C++ standards before C++20}}
+};
+}
More information about the cfe-commits
mailing list