Commit 9579624e by Kriang Lerdsuwanakij Committed by Kriang Lerdsuwanakij

re PR c++/2513 (internal template template parameter causes ICE)

	PR c++/2513
	* decl.c (make_typename_type): Use dependent_type_p.
	(make_unbound_class_template): Likewise.
	* pt.c (instantiate_class_template): Increment
	processing_template_decl during substitution of template friend
	function.  Preincrement processing_template_decl rather than
	postincrement.
	(get_mostly_instantiated_function_type): Increment
	processing_template_decl during partial substitution of function
	type.

	* g++.dg/template/typename5.C: New test.

From-SVN: r72611
parent 5511bc2e
2003-10-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/2513
* decl.c (make_typename_type): Use dependent_type_p.
(make_unbound_class_template): Likewise.
* pt.c (instantiate_class_template): Increment
processing_template_decl during substitution of template friend
function. Preincrement processing_template_decl rather than
postincrement.
(get_mostly_instantiated_function_type): Increment
processing_template_decl during partial substitution of function
type.
2003-10-15 Jan Hubicka <jh@suse.cz> 2003-10-15 Jan Hubicka <jh@suse.cz>
pr c++/12574 pr c++/12574
......
...@@ -2604,7 +2604,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain) ...@@ -2604,7 +2604,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain)
return error_mark_node; return error_mark_node;
} }
if (! uses_template_parms (context) if (!dependent_type_p (context)
|| currently_open_class (context)) || currently_open_class (context))
{ {
if (TREE_CODE (fullname) == TEMPLATE_ID_EXPR) if (TREE_CODE (fullname) == TEMPLATE_ID_EXPR)
...@@ -2663,7 +2663,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain) ...@@ -2663,7 +2663,7 @@ make_typename_type (tree context, tree name, tsubst_flags_t complain)
/* If the CONTEXT is not a template type, then either the field is /* If the CONTEXT is not a template type, then either the field is
there now or its never going to be. */ there now or its never going to be. */
if (!uses_template_parms (context)) if (!dependent_type_p (context))
{ {
if (complain & tf_error) if (complain & tf_error)
error ("no type named `%#T' in `%#T'", name, context); error ("no type named `%#T' in `%#T'", name, context);
...@@ -2692,7 +2692,7 @@ make_unbound_class_template (tree context, tree name, tsubst_flags_t complain) ...@@ -2692,7 +2692,7 @@ make_unbound_class_template (tree context, tree name, tsubst_flags_t complain)
if (TREE_CODE (name) != IDENTIFIER_NODE) if (TREE_CODE (name) != IDENTIFIER_NODE)
abort (); abort ();
if (!uses_template_parms (context) if (!dependent_type_p (context)
|| currently_open_class (context)) || currently_open_class (context))
{ {
tree tmpl = NULL_TREE; tree tmpl = NULL_TREE;
......
...@@ -5294,10 +5294,10 @@ instantiate_class_template (tree type) ...@@ -5294,10 +5294,10 @@ instantiate_class_template (tree type)
tree r; tree r;
if (TREE_CODE (t) == TEMPLATE_DECL) if (TREE_CODE (t) == TEMPLATE_DECL)
processing_template_decl++; ++processing_template_decl;
r = tsubst (t, args, tf_error, NULL_TREE); r = tsubst (t, args, tf_error, NULL_TREE);
if (TREE_CODE (t) == TEMPLATE_DECL) if (TREE_CODE (t) == TEMPLATE_DECL)
processing_template_decl--; --processing_template_decl;
set_current_access_from_decl (r); set_current_access_from_decl (r);
grok_special_member_properties (r); grok_special_member_properties (r);
finish_member_declaration (r); finish_member_declaration (r);
...@@ -5317,10 +5317,10 @@ instantiate_class_template (tree type) ...@@ -5317,10 +5317,10 @@ instantiate_class_template (tree type)
input_location = DECL_SOURCE_LOCATION (t); input_location = DECL_SOURCE_LOCATION (t);
if (TREE_CODE (t) == TEMPLATE_DECL) if (TREE_CODE (t) == TEMPLATE_DECL)
processing_template_decl++; ++processing_template_decl;
r = tsubst (t, args, tf_error | tf_warning, NULL_TREE); r = tsubst (t, args, tf_error | tf_warning, NULL_TREE);
if (TREE_CODE (t) == TEMPLATE_DECL) if (TREE_CODE (t) == TEMPLATE_DECL)
processing_template_decl--; --processing_template_decl;
if (TREE_CODE (r) == VAR_DECL) if (TREE_CODE (r) == VAR_DECL)
{ {
tree init; tree init;
...@@ -5412,9 +5412,17 @@ instantiate_class_template (tree type) ...@@ -5412,9 +5412,17 @@ instantiate_class_template (tree type)
--processing_template_decl; --processing_template_decl;
} }
else else
/* Build new DECL_FRIENDLIST. */ {
add_friend (type, tsubst_friend_function (t, args), /* Build new DECL_FRIENDLIST. */
/*complain=*/false); tree r;
if (TREE_CODE (t) == TEMPLATE_DECL)
++processing_template_decl;
r = tsubst_friend_function (t, args);
if (TREE_CODE (t) == TEMPLATE_DECL)
--processing_template_decl;
add_friend (type, r, /*complain=*/false);
}
} }
} }
...@@ -11246,9 +11254,11 @@ get_mostly_instantiated_function_type (tree decl) ...@@ -11246,9 +11254,11 @@ get_mostly_instantiated_function_type (tree decl)
specialized or not. */ specialized or not. */
push_access_scope (decl); push_access_scope (decl);
++processing_template_decl;
/* Now, do the (partial) substitution to figure out the /* Now, do the (partial) substitution to figure out the
appropriate function type. */ appropriate function type. */
fn_type = tsubst (fn_type, partial_args, tf_error, NULL_TREE); fn_type = tsubst (fn_type, partial_args, tf_error, NULL_TREE);
--processing_template_decl;
/* Substitute into the template parameters to obtain the real /* Substitute into the template parameters to obtain the real
innermost set of parameters. This step is important if the innermost set of parameters. This step is important if the
......
2003-10-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> 2003-10-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/2513
* g++.dg/template/typename5.C: New test.
2003-10-17 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/12369 PR c++/12369
* g++.dg/template/friend25.C: New test. * g++.dg/template/friend25.C: New test.
......
// { dg-do compile }
// Origin: ariels@compugen.co.il
// PR c++/2513: typename handling when scope is dependent as
// described in DR108.
template <bool flag> struct Select {
typedef int Result;
};
template <template<class> class Pred> struct FindType {
typedef typename Select<true>::Result Result;
};
template <int bits> struct Int {
template<typename T> struct RightSize {};
typedef typename FindType<RightSize>::Result type;
};
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