https://github.com/jcsxky updated https://github.com/llvm/llvm-project/pull/83847
>From da384cdf38f64d7c956c07b007f417dd223177ef Mon Sep 17 00:00:00 2001 From: huqizhi <huqi...@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 | 4 ++++ clang/lib/Sema/SemaAccess.cpp | 9 +++++++++ clang/test/SemaTemplate/PR25708.cpp | 23 +++++++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 clang/test/SemaTemplate/PR25708.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 0ee2801766a9cc..3f4bd5503983d5 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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits