c++: explicit inst w/ similar constrained partial specs [PR104634]
Here we neglect to emit the definitions of A<double>::f2 and A<double*>::f4 despite the explicit instantiations ultimately because TREE_PUBLIC isn't set on the corresponding partial specializations, whose declarations are created from maybe_new_partial_specialization which is responsible for disambiguating them from the first and third partial specializations (which have the same class-head but different constraints). This makes grokfndecl in turn clear TREE_PUBLIC for f2 and f4 as if they have internal linkage. This patch fixes this by setting TREE_PUBLIC appropriately for such partial specializations. PR c++/104634 gcc/cp/ChangeLog: * pt.cc (maybe_new_partial_specialization): Propagate TREE_PUBLIC to the newly created partial specialization. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-explicit-inst6.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
This commit is contained in:
parent
d33c3b5ac9
commit
47673571b2
2 changed files with 36 additions and 0 deletions
|
@ -980,6 +980,7 @@ maybe_new_partial_specialization (tree& type)
|
|||
DECL_SOURCE_LOCATION (d) = input_location;
|
||||
TREE_PRIVATE (d) = (current_access_specifier == access_private_node);
|
||||
TREE_PROTECTED (d) = (current_access_specifier == access_protected_node);
|
||||
TREE_PUBLIC (d) = TREE_PUBLIC (DECL_TEMPLATE_RESULT (tmpl));
|
||||
|
||||
set_instantiating_module (d);
|
||||
DECL_MODULE_EXPORT_P (d) = DECL_MODULE_EXPORT_P (tmpl);
|
||||
|
|
35
gcc/testsuite/g++.dg/cpp2a/concepts-explicit-inst6.C
Normal file
35
gcc/testsuite/g++.dg/cpp2a/concepts-explicit-inst6.C
Normal file
|
@ -0,0 +1,35 @@
|
|||
// PR c++/104634
|
||||
// { dg-do compile { target c++20 } }
|
||||
|
||||
// { dg-final { scan-assembler "_ZN1AIiE2f1Ev" } }
|
||||
// { dg-final { scan-assembler "_ZN1AIdE2f2Ev" } }
|
||||
// { dg-final { scan-assembler "_ZN1AIPiE2f3Ev" } }
|
||||
// { dg-final { scan-assembler "_ZN1AIPdE2f4Ev" } }
|
||||
|
||||
template<class T>
|
||||
struct A { };
|
||||
|
||||
template<class T> requires __is_same(T, int)
|
||||
struct A<T> {
|
||||
void f1() { }
|
||||
};
|
||||
|
||||
template<class T> requires __is_same(T, double)
|
||||
struct A<T> {
|
||||
void f2() { }
|
||||
};
|
||||
|
||||
template<class T> requires __is_same(T, int)
|
||||
struct A<T*> {
|
||||
void f3() { }
|
||||
};
|
||||
|
||||
template<class T> requires __is_same(T, double)
|
||||
struct A<T*> {
|
||||
void f4() { }
|
||||
};
|
||||
|
||||
template struct A<int>;
|
||||
template struct A<double>;
|
||||
template struct A<int*>;
|
||||
template struct A<double*>;
|
Loading…
Add table
Reference in a new issue