[clang] [Clang][Sema] Allow access to a public template alias declaration that refers to friend's private nested type (PR #83847)
Qizhi Hu via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 8 04:29:28 PST 2024
https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/83847
>From 1c37abe8f7b26bd44fcf8e18a4cbc5104c7bd908 Mon Sep 17 00:00:00 2001
From: huqizhi <huqizhi at feysh.com>
Date: Mon, 4 Mar 2024 21:51:07 +0800
Subject: [PATCH] [Clang][Sema] Allow access to a public template alias
declaration that refers to friend's private nested type
---
clang/docs/ReleaseNotes.rst | 6 +++++-
clang/lib/Sema/SemaAccess.cpp | 9 +++++++++
clang/test/SemaTemplate/PR25708.cpp | 23 +++++++++++++++++++++++
3 files changed, 37 insertions(+), 1 deletion(-)
create mode 100644 clang/test/SemaTemplate/PR25708.cpp
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 0ee2801766a9cc..2d76d3717ab954 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -254,6 +254,10 @@ Bug Fixes in This Version
operator.
Fixes (#GH83267).
+- Allow access to a public template alias declaration that refers to friend's
+ private nested type.
+ Fixes (#GH25708).
+
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -402,7 +406,7 @@ RISC-V Support
CUDA/HIP Language Changes
^^^^^^^^^^^^^^^^^^^^^^^^^
-- PTX is no longer included by default when compiling for CUDA. Using
+- PTX is no longer included by default when compiling for CUDA. Using
``--cuda-include-ptx=all`` will return the old behavior.
CUDA Support
diff --git a/clang/lib/Sema/SemaAccess.cpp b/clang/lib/Sema/SemaAccess.cpp
index 4af3c0f30a8e8a..0c8d15210f439c 100644
--- a/clang/lib/Sema/SemaAccess.cpp
+++ b/clang/lib/Sema/SemaAccess.cpp
@@ -1481,6 +1481,15 @@ static Sema::AccessResult CheckAccess(Sema &S, SourceLocation Loc,
}
EffectiveContext EC(S.CurContext);
+ if (!S.CodeSynthesisContexts.empty()) {
+ auto &Active = S.CodeSynthesisContexts.back();
+ if (Active.Kind == Sema::CodeSynthesisContext::TemplateInstantiation &&
+ Active.Entity)
+ if (auto *RD =
+ dyn_cast_or_null<CXXRecordDecl>(Active.Entity->getDeclContext()))
+ EC.Records.push_back(RD);
+ }
+
switch (CheckEffectiveAccess(S, EC, Loc, Entity)) {
case AR_accessible: return Sema::AR_accessible;
case AR_inaccessible: return Sema::AR_inaccessible;
diff --git a/clang/test/SemaTemplate/PR25708.cpp b/clang/test/SemaTemplate/PR25708.cpp
new file mode 100644
index 00000000000000..cc2e7551a6abaa
--- /dev/null
+++ b/clang/test/SemaTemplate/PR25708.cpp
@@ -0,0 +1,23 @@
+// RUN: %clang_cc1 -std=c++11 -verify %s
+// RUN: %clang_cc1 -std=c++14 -verify %s
+// RUN: %clang_cc1 -std=c++17 -verify %s
+// RUN: %clang_cc1 -std=c++20 -verify %s
+// expected-no-diagnostics
+
+struct FooAccessor
+{
+ template <typename T>
+ using Foo = typename T::Foo;
+};
+
+class Type
+{
+ friend struct FooAccessor;
+
+ using Foo = int;
+};
+
+int main()
+{
+ FooAccessor::Foo<Type> t;
+}
More information about the cfe-commits
mailing list