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>
PR c++/40834
......
......@@ -3616,6 +3616,8 @@ enum tsubst_flags {
conversion. */
tf_no_access_control = 1 << 7, /* Do not perform access checks, even
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. */
tf_warning_or_error = tf_warning | tf_error
};
......
......@@ -182,7 +182,10 @@ count_non_default_template_args (tree args, tree params)
if (uses_template_parms (def))
{
++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;
}
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)
But, such constructs have already been resolved by this
point, so here CTX really should have complete type, unless
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 (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>
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