[clang] 6d9b847 - [C++20] [Modules] Handle reachability for partial specialization
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 22 02:04:29 PDT 2022
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'}}
+}
More information about the cfe-commits
mailing list