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:
parent
80f7a782fd
commit
3579964bee
|
@ -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.
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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 "";
|
||||
|
|
12
gcc/cp/pt.c
12
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;
|
||||
|
||||
|
|
|
@ -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" }
|
||||
}
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue