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
This commit is contained in:
Jason Merrill 2013-04-22 16:40:54 -04:00 committed by Jason Merrill
parent 80f7a782fd
commit 3579964bee
7 changed files with 47 additions and 4 deletions

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

View 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. */

View 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 "";

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

View File

@ -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" }
}

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

View 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