Author: Chuanqi Xu Date: 2022-07-22T17:03:38+08:00 New Revision: 6d9b84797c1c4bd00a2392043e9feea4ecebe482
URL: https://github.com/llvm/llvm-project/commit/6d9b84797c1c4bd00a2392043e9feea4ecebe482 DIFF: https://github.com/llvm/llvm-project/commit/6d9b84797c1c4bd00a2392043e9feea4ecebe482.diff LOG: [C++20] [Modules] Handle reachability for partial specialization Previously we don't catch the reachability for partial specialization. Handle them in this patch. Added: clang/test/Modules/partial_specialization.cppm Modified: clang/lib/Sema/SemaTemplate.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 171f005816b5c..95c83ebfaeab5 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -4573,7 +4573,7 @@ Sema::CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc, void *InsertPos = nullptr; if (VarTemplateSpecializationDecl *Spec = Template->findSpecialization( Converted, InsertPos)) { - checkSpecializationVisibility(TemplateNameLoc, Spec); + checkSpecializationReachability(TemplateNameLoc, Spec); // If we already have a variable template specialization, return it. return Spec; } @@ -4694,7 +4694,7 @@ Sema::CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc, dyn_cast<VarTemplatePartialSpecializationDecl>(InstantiationPattern)) Decl->setInstantiationOf(D, InstantiationArgs); - checkSpecializationVisibility(TemplateNameLoc, Decl); + checkSpecializationReachability(TemplateNameLoc, Decl); assert(Decl && "No variable template specialization?"); return Decl; diff --git a/clang/test/Modules/partial_specialization.cppm b/clang/test/Modules/partial_specialization.cppm new file mode 100644 index 0000000000000..3a01857172112 --- /dev/null +++ b/clang/test/Modules/partial_specialization.cppm @@ -0,0 +1,34 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t +// RUN: cd %t +// +// RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/A.cppm -o %t/A.pcm +// RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -fsyntax-only -verify +// +//--- foo.h +template<typename T, typename U> +inline constexpr bool IsSame = false; + +template<typename T> +inline constexpr bool IsSame<T, T> = true; + +template <typename T> +class A { +public: + A(); + ~A() noexcept(IsSame<T, T>); +}; + +//--- A.cppm +module; +#include "foo.h" +export module A; +export using ::A; + +//--- Use.cpp +import A; +void bool_consume(bool b); +void use() { + A<int> a{}; + bool_consume(IsSame); // expected-error {{use of undeclared identifier 'IsSame'}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits