aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-04-22 16:40:54 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-04-22 16:40:54 -0400
commit3579964bee6f4b621322d367de1fa6ce4b36befc (patch)
tree2557ab41483c15f17bc88b693aca993a7c24de7b
parent80f7a782fd5a8030805a56db68c85db3bd139e23 (diff)
downloadgcc-3579964bee6f4b621322d367de1fa6ce4b36befc.zip
gcc-3579964bee6f4b621322d367de1fa6ce4b36befc.tar.gz
gcc-3579964bee6f4b621322d367de1fa6ce4b36befc.tar.bz2
pt.c (fn_type_unification): Push tinst level around type_unification_real if we aren't explaining.
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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-tree.h5
-rw-r--r--gcc/cp/error.c6
-rw-r--r--gcc/cp/pt.c12
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C17
-rw-r--r--libstdc++-v3/ChangeLog3
-rw-r--r--libstdc++-v3/testsuite/lib/prune.exp2
7 files changed, 47 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index cb27315..8b0225b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index a5c7548..d96340a 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -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. */
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 3206342..7a8c0bc 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -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 "";
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 6ce2770..855c1f7 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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
index 0000000..0821fc0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/fntmpdefarg5.C
@@ -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" }
+}
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index b44f584..ec91a24 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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.
diff --git a/libstdc++-v3/testsuite/lib/prune.exp b/libstdc++-v3/testsuite/lib/prune.exp
index b17fa00..6ed3efb 100644
--- a/libstdc++-v3/testsuite/lib/prune.exp
+++ b/libstdc++-v3/testsuite/lib/prune.exp
@@ -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