pt.c (fn_type_unification): Push tinst level around type_unification_real if we aren...
authorJason Merrill <jason@redhat.com>
Mon, 22 Apr 2013 20:40:54 +0000 (16:40 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 22 Apr 2013 20:40:54 +0000 (16:40 -0400)
gcc/cp/
* pt.c (fn_type_unification): Push tinst level around
type_unification_real if we aren't explaining.
* cp-tree.h (TFF_NO_TEMPLATE_BINDINGS): New.
* error.c (dump_function_decl): Respect it.
(subst_to_string): Pass it.
libstdc++-v3/
* testsuite/lib/prune.exp (libstdc++-dg-prune): Also ignore "In
substitution" lines.

From-SVN: r198161

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/error.c
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C [new file with mode: 0644]
libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/lib/prune.exp

index cb27315c6b9412336f11e4e455ddba0ebbab8202..8b0225b35e93a8728f96bc5e1f79b31ecbfbe3ee 100644 (file)
@@ -1,5 +1,11 @@
 2013-04-22  Jason Merrill  <jason@redhat.com>
 
+       * pt.c (fn_type_unification): Push tinst level around
+       type_unification_real if we aren't explaining.
+       * cp-tree.h (TFF_NO_TEMPLATE_BINDINGS): New.
+       * error.c (dump_function_decl): Respect it.
+       (subst_to_string): Pass it.
+
        PR c++/48665
        * rtti.c (get_typeid): Diagnose qualified function type.
        * pt.c (tsubst) [POINTER_TYPE]: Likewise.
index a5c75486f5ca76059b021ed7636437e01ce53b76..d96340a13756a133792f3777dcd8c23a26fcf95c 100644 (file)
@@ -4636,7 +4636,9 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG };
    TFF_UNQUALIFIED_NAME: do not print the qualifying scope of the
        top-level entity.
    TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS: do not omit template arguments
-       identical to their defaults.  */
+       identical to their defaults.
+   TFF_NO_TEMPLATE_BINDINGS: do not print information about the template
+       arguments for a function template specialization.  */
 
 #define TFF_PLAIN_IDENTIFIER                   (0)
 #define TFF_SCOPE                              (1)
@@ -4652,6 +4654,7 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG };
 #define TFF_NO_FUNCTION_ARGUMENTS              (1 << 10)
 #define TFF_UNQUALIFIED_NAME                   (1 << 11)
 #define TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS (1 << 12)
+#define TFF_NO_TEMPLATE_BINDINGS               (1 << 13)
 
 /* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM
    node.  */
index 32063429611208c87813c114f3f707e0c2a72875..7a8c0bca3c144126057d73b31ec01629b5579a4c 100644 (file)
@@ -1451,7 +1451,8 @@ dump_function_decl (tree t, int flags)
        dump_type_suffix (TREE_TYPE (fntype), flags);
 
       /* If T is a template instantiation, dump the parameter binding.  */
-      if (template_parms != NULL_TREE && template_args != NULL_TREE)
+      if (template_parms != NULL_TREE && template_args != NULL_TREE
+         && !(flags & TFF_NO_TEMPLATE_BINDINGS))
        {
          pp_cxx_whitespace (cxx_pp);
          pp_cxx_left_bracket (cxx_pp);
@@ -2889,7 +2890,8 @@ subst_to_string (tree p)
   tree decl = TREE_PURPOSE (p);
   tree targs = TREE_VALUE (p);
   tree tparms = DECL_TEMPLATE_PARMS (decl);
-  int flags = TFF_DECL_SPECIFIERS|TFF_TEMPLATE_HEADER;
+  int flags = (TFF_DECL_SPECIFIERS|TFF_TEMPLATE_HEADER
+              |TFF_NO_TEMPLATE_BINDINGS);
 
   if (p == NULL_TREE)
     return "";
index 6ce2770c1c603ca71a57f408124f444276f77f03..855c1f7abe4144482c979809be22d9f599f978aa 100644 (file)
@@ -15125,9 +15125,21 @@ fn_type_unification (tree fn,
      callers must be ready to deal with unification failures in any
      event.  */
 
+  TREE_VALUE (tinst) = targs;
+  /* If we aren't explaining yet, push tinst context so we can see where
+     any errors (e.g. from class instantiations triggered by instantiation
+     of default template arguments) come from.  If we are explaining, this
+     context is redundant.  */
+  if (!explain_p && !push_tinst_level (tinst))
+    {
+      excessive_deduction_depth = true;
+      goto fail;
+    }
   ok = !type_unification_real (DECL_INNERMOST_TEMPLATE_PARMS (fn),
                               targs, parms, args, nargs, /*subr=*/0,
                               strict, flags, explain_p);
+  if (!explain_p)
+    pop_tinst_level ();
   if (!ok)
     goto fail;
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C
new file mode 100644 (file)
index 0000000..0821fc0
--- /dev/null
@@ -0,0 +1,17 @@
+// Only print template subst context when it isn't redundant.
+// { dg-require-effective-target c++11 }
+// { dg-prune-output "error" }
+
+template<class T> struct A { typedef typename T::type type; };
+
+template <class T, class U = typename A<T>::type>
+void f(T);
+
+template <class T, class U = typename T::type>
+void g(T);
+
+int main()
+{
+  f(1);                                // { dg-message "required from here" }
+  g(1);                                // { dg-bogus "required from here" }
+}
index b44f584bfc26ab7186c62a925abf3a153f64c887..ec91a2412a6760b3ef1629569fdf62d43c985519 100644 (file)
@@ -1,5 +1,8 @@
 2013-04-22  Jason Merrill  <jason@redhat.com>
 
+       * testsuite/lib/prune.exp (libstdc++-dg-prune): Also ignore "In
+       substitution" lines.
+
        * testsuite/20_util/is_assignable/value.cc: Comment out tests involving
        function-cv-quals.
        * testsuite/20_util/is_constructible/value-2.cc: Likewise.
index b17fa00c404bf0f446a16d650d78878e43b759af..6ed3efbf474aa3754eaa5e23f3a65dac4728656b 100644 (file)
@@ -42,7 +42,7 @@ proc libstdc++-dg-prune { system text } {
 
     # Remove parts of warnings that refer to location of previous
     # definitions, etc as these confuse dejagnu
-    regsub -all "(^|\n)(\[^\n\]*: )?In ((static member |lambda )?function|member|method|(copy )?constructor|destructor|instantiation|program|subroutine|block-data)\[^\n\]*" $text "" text
+    regsub -all "(^|\n)(\[^\n\]*: )?In ((static member |lambda )?function|member|method|(copy )?constructor|destructor|instantiation|substitution|program|subroutine|block-data)\[^\n\]*" $text "" text
     regsub -all "(^|\n)\[^\n\]*(: )?At (top level|global scope):\[^\n\]*" $text "" text
     regsub -all "(^|\n)\[^\n\]*:   (recursively )?required \[^\n\]*" $text "" text
     regsub -all "(^|\n)\[^\n\]*:   . skipping \[0-9\]* instantiation contexts \[^\n\]*" $text "" text