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:
Kriang Lerdsuwanakij 2000-12-15 01:11:38 +00:00 committed by Kriang Lerdsuwanakij
parent 07467d31de
commit edac124d95
4 changed files with 60 additions and 0 deletions

View File

@ -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 >?

View File

@ -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);

View File

@ -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.

View 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);
}