aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2000-12-15 01:11:38 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2000-12-15 01:11:38 +0000
commitedac124d95be8bd327fd5754651f4eb25f0a280b (patch)
treef98f68098b30f27326cc180033a42815d24ad090 /gcc
parent07467d31def1f9c3870a3b0ae6c8756b6244ac41 (diff)
downloadgcc-edac124d95be8bd327fd5754651f4eb25f0a280b.zip
gcc-edac124d95be8bd327fd5754651f4eb25f0a280b.tar.gz
gcc-edac124d95be8bd327fd5754651f4eb25f0a280b.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c25
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/spec33.C26
4 files changed, 60 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9c3fd36..07753bf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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 >?
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index a4463eb..34540a8 100644
--- a/gcc/cp/pt.c
+++ b/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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b47b75b..a12aab2 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/spec33.C b/gcc/testsuite/g++.old-deja/g++.pt/spec33.C
new file mode 100644
index 0000000..a458c1d
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/spec33.C
@@ -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);
+}