mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-08 13:17:27 +08:00
pt.c (check_explicit_specialization): Propagate default function arguments to explicit specializations.
* pt.c (check_explicit_specialization): Propagate default function arguments to explicit specializations. * g++.old-deja/g++.pt/spec33.C: New test. From-SVN: r38266
This commit is contained in:
parent
07467d31de
commit
edac124d95
@ -1,3 +1,8 @@
|
||||
2000-12-14 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
|
||||
|
||||
* pt.c (check_explicit_specialization): Propagate default
|
||||
function arguments to explicit specializations.
|
||||
|
||||
2000-12-13 DJ Delorie <dj@redhat.com>
|
||||
|
||||
* typeck.c (build_binary_op): Do signed/unsigned warnings for >?
|
||||
|
25
gcc/cp/pt.c
25
gcc/cp/pt.c
@ -1543,6 +1543,31 @@ check_explicit_specialization (declarator, decl, template_count, flags)
|
||||
last_function_parms = TREE_CHAIN (last_function_parms);
|
||||
}
|
||||
|
||||
/* Inherit default function arguments from the template
|
||||
DECL is specializing. */
|
||||
{
|
||||
tree t1 = TYPE_ARG_TYPES (TREE_TYPE (decl));
|
||||
tree t2 = TYPE_ARG_TYPES (TREE_TYPE (DECL_TEMPLATE_RESULT (tmpl)));
|
||||
|
||||
/* DECL may contain more parameters than TMPL due to the extra
|
||||
in-charge parameter in constructors and destructors. */
|
||||
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
|
||||
t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2);
|
||||
if (DECL_HAS_IN_CHARGE_PARM_P (decl))
|
||||
t1 = TREE_CHAIN (t1);
|
||||
|
||||
/* Note that we do not need to reparse default arguments,
|
||||
since explicit specialization cannot be declared in
|
||||
class scope as in [temp.expl.spec]. */
|
||||
for (; t1 && t2; t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
|
||||
{
|
||||
if (TREE_PURPOSE (t2))
|
||||
TREE_PURPOSE (t1) = TREE_PURPOSE (t2);
|
||||
}
|
||||
|
||||
my_friendly_assert (t1 == NULL_TREE && t2 == NULL_TREE, 20001211);
|
||||
}
|
||||
|
||||
/* Set up the DECL_TEMPLATE_INFO for DECL. */
|
||||
DECL_TEMPLATE_INFO (decl) = tree_cons (tmpl, targs, NULL_TREE);
|
||||
|
||||
|
@ -1,3 +1,7 @@
|
||||
2000-12-14 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
|
||||
|
||||
* g++.old-deja/g++.pt/spec33.C: New test.
|
||||
|
||||
2000-12-14 Catherine Moore <clm@redhat.com>
|
||||
|
||||
* gcc.c-torture/execute/920501-7.c: Check for NO_TRAMPOLINES.
|
||||
|
26
gcc/testsuite/g++.old-deja/g++.pt/spec33.C
Normal file
26
gcc/testsuite/g++.old-deja/g++.pt/spec33.C
Normal file
@ -0,0 +1,26 @@
|
||||
// Build don't link:
|
||||
// Origin: James McKelvey <mckelvey@fafnir.com>
|
||||
|
||||
class A
|
||||
{
|
||||
public:
|
||||
template <class T> A(T x, bool y = false);
|
||||
};
|
||||
|
||||
template <class T> A::A(T, bool)
|
||||
{
|
||||
}
|
||||
|
||||
template <> A::A(char, bool)
|
||||
{
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int b;
|
||||
char c;
|
||||
|
||||
A x(b);
|
||||
A y(c);
|
||||
A z(c, false);
|
||||
}
|
Loading…
Reference in New Issue
Block a user