Commit 8b334f7b by Jason Merrill Committed by Jason Merrill

re PR c++/14912 (Do not print default template arguments in error messages)

	PR c++/14912
	* cp-tree.h (enum tsubst_flags): Add tf_no_class_instantiations.
	* error.c (count_non_default_template_args): Pass it.
	* pt.c (tsubst) [TYPENAME_TYPE]: Don't complete type if it's set.

From-SVN: r150223
parent 9e34da8b
2009-07-29 Jason Merrill <jason@redhat.com>
PR c++/14912
* cp-tree.h (enum tsubst_flags): Add tf_no_class_instantiations.
* error.c (count_non_default_template_args): Pass it.
* pt.c (tsubst) [TYPENAME_TYPE]: Don't complete type if it's set.
2009-07-29 Richard Guenther <rguenther@suse.de> 2009-07-29 Richard Guenther <rguenther@suse.de>
PR c++/40834 PR c++/40834
......
...@@ -3616,6 +3616,8 @@ enum tsubst_flags { ...@@ -3616,6 +3616,8 @@ enum tsubst_flags {
conversion. */ conversion. */
tf_no_access_control = 1 << 7, /* Do not perform access checks, even tf_no_access_control = 1 << 7, /* Do not perform access checks, even
when issuing other errors. */ when issuing other errors. */
/* Do not instantiate classes (used by count_non_default_template_args). */
tf_no_class_instantiations = 1 << 8,
/* Convenient substitution flags combinations. */ /* Convenient substitution flags combinations. */
tf_warning_or_error = tf_warning | tf_error tf_warning_or_error = tf_warning | tf_error
}; };
......
...@@ -182,7 +182,10 @@ count_non_default_template_args (tree args, tree params) ...@@ -182,7 +182,10 @@ count_non_default_template_args (tree args, tree params)
if (uses_template_parms (def)) if (uses_template_parms (def))
{ {
++processing_template_decl; ++processing_template_decl;
def = tsubst_copy_and_build (def, args, tf_none, NULL_TREE, false, true); /* This speculative substitution must not cause any classes to be
instantiated that otherwise wouldn't be. */
def = tsubst_copy_and_build (def, args, tf_no_class_instantiations,
NULL_TREE, false, true);
--processing_template_decl; --processing_template_decl;
} }
if (!cp_tree_equal (TREE_VEC_ELT (inner_args, last), def)) if (!cp_tree_equal (TREE_VEC_ELT (inner_args, last), def))
......
...@@ -9890,7 +9890,8 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) ...@@ -9890,7 +9890,8 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
But, such constructs have already been resolved by this But, such constructs have already been resolved by this
point, so here CTX really should have complete type, unless point, so here CTX really should have complete type, unless
it's a partial instantiation. */ it's a partial instantiation. */
ctx = complete_type (ctx); if (!(complain & tf_no_class_instantiations))
ctx = complete_type (ctx);
if (!COMPLETE_TYPE_P (ctx)) if (!COMPLETE_TYPE_P (ctx))
{ {
if (complain & tf_error) if (complain & tf_error)
......
2009-07-29 Jason Merrill <jason@redhat.com>
PR c++/14912
* g++.dg/template/defarg13.C: New.
2009-07-29 Richard Guenther <rguenther@suse.de> 2009-07-29 Richard Guenther <rguenther@suse.de>
PR c++/40834 PR c++/40834
......
// PR c++/14912
// Bug: We were instantiating A<B> in order to compare it to the matching
// argument for C<B,B>, which fails.
template <class T>
struct A
{
typedef typename T::F F;
};
struct B { };
template <class T, class U = typename A<T>::F >
struct C
{
typename T::F f; // { dg-error "no type" }
};
C<B, B> c; // { dg-message "instantiated" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment