[clang] d911085 - [Clang] Fix an incorrect assumption on getTemplatedDecl() (#131559)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 17 01:54:00 PDT 2025
Author: Younan Zhang
Date: 2025-03-17T16:53:57+08:00
New Revision: d9110858ee938db424887cd3435488525dd632cb
URL: https://github.com/llvm/llvm-project/commit/d9110858ee938db424887cd3435488525dd632cb
DIFF: https://github.com/llvm/llvm-project/commit/d9110858ee938db424887cd3435488525dd632cb.diff
LOG: [Clang] Fix an incorrect assumption on getTemplatedDecl() (#131559)
Since a68d20e98, we've been calling HandleDelayedAccessCheck() for
concept declarations when the declaration contains invalid member
accesses.
However, a concept declaration is TemplateDecl such that doesn't contain
any TemplatedDecl.
Fixes https://github.com/llvm/llvm-project/issues/131530
Added:
Modified:
clang/lib/Sema/SemaAccess.cpp
clang/test/SemaCXX/concept-crash-on-diagnostic.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaAccess.cpp b/clang/lib/Sema/SemaAccess.cpp
index f79d9a758e7af..6813786df3fc4 100644
--- a/clang/lib/Sema/SemaAccess.cpp
+++ b/clang/lib/Sema/SemaAccess.cpp
@@ -1518,8 +1518,8 @@ void Sema::HandleDelayedAccessCheck(DelayedDiagnostic &DD, Decl *D) {
} else if (FunctionDecl *FN = dyn_cast<FunctionDecl>(D)) {
DC = FN;
} else if (TemplateDecl *TD = dyn_cast<TemplateDecl>(D)) {
- if (isa<DeclContext>(TD->getTemplatedDecl()))
- DC = cast<DeclContext>(TD->getTemplatedDecl());
+ if (auto *D = dyn_cast_if_present<DeclContext>(TD->getTemplatedDecl()))
+ DC = D;
} else if (auto *RD = dyn_cast<RequiresExprBodyDecl>(D)) {
DC = RD;
}
diff --git a/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp b/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp
index 71e55c8290ee4..c38f8888075de 100644
--- a/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp
+++ b/clang/test/SemaCXX/concept-crash-on-diagnostic.cpp
@@ -36,3 +36,15 @@ void function() {
// expected-note@#4 {{candidate template ignored: constraints not satisfied [with IteratorL = Object *, IteratorR = Object *]}}
// We don't know exactly the substituted type for `lhs == rhs`, thus a placeholder 'expr-type' is emitted.
// expected-note@#3 {{because 'convertible_to<expr-type, bool>' would be invalid}}
+
+namespace GH131530 {
+
+class foo {
+ struct bar {}; // expected-note {{implicitly declared private}}
+};
+
+template <typename T>
+concept is_foo_concept = __is_same(foo::bar, T);
+// expected-error at -1 {{'bar' is a private member of 'GH131530::foo'}}
+
+}
More information about the cfe-commits
mailing list