]> gcc.gnu.org Git - gcc.git/commitdiff
pt.c (check_explicit_specialization): Propagate default function arguments to explici...
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Fri, 15 Dec 2000 01:11:38 +0000 (01:11 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Fri, 15 Dec 2000 01:11:38 +0000 (01:11 +0000)
* pt.c (check_explicit_specialization): Propagate default
function arguments to explicit specializations.

* g++.old-deja/g++.pt/spec33.C: New test.

From-SVN: r38266

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/spec33.C [new file with mode: 0644]

index 9c3fd361840a9dba813bc5a599b3f6d0c7443be1..07753bf4149239f782e10a87400cbd362eaf4cc8 100644 (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 >?
index a4463ebe48b3705852ac5719c75736022d5fda82..34540a84b33d46f7af84f21ff4a6a5275e3f8678 100644 (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);
 
index b47b75b71ffcab92b8d2a3d330ef37d40bf29101..a12aab2af50e0b0c3ec3e29b4171f95f5d0663e4 100644 (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.
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 (file)
index 0000000..a458c1d
--- /dev/null
@@ -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);
+}
This page took 0.114335 seconds and 5 git commands to generate.