Commit 8efcbeca by Jason Merrill Committed by Jason Merrill

re PR c++/48657 (could not convert template argument ‘VectorDimension’ to ‘unsigned int’)

	PR c++/48657
	* decl.c (cp_finish_decl): Simplify template handling.

From-SVN: r172790
parent 4a25752b
2011-04-20 Jason Merrill <jason@redhat.com>
PR c++/48657
* decl.c (cp_finish_decl): Simplify template handling.
2011-04-20 Jim Meyering <meyering@redhat.com> 2011-04-20 Jim Meyering <meyering@redhat.com>
* tree.c (cxx_printable_name_internal): Remove useless if-before-free. * tree.c (cxx_printable_name_internal): Remove useless if-before-free.
......
...@@ -5750,7 +5750,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -5750,7 +5750,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
const char *asmspec = NULL; const char *asmspec = NULL;
int was_readonly = 0; int was_readonly = 0;
bool var_definition_p = false; bool var_definition_p = false;
int saved_processing_template_decl;
tree auto_node; tree auto_node;
if (decl == error_mark_node) if (decl == error_mark_node)
...@@ -5772,7 +5771,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -5772,7 +5771,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
/* Assume no cleanup is required. */ /* Assume no cleanup is required. */
cleanup = NULL_TREE; cleanup = NULL_TREE;
saved_processing_template_decl = processing_template_decl;
/* If a name was specified, get the string. */ /* If a name was specified, get the string. */
if (global_scope_p (current_binding_level)) if (global_scope_p (current_binding_level))
...@@ -5878,39 +5876,24 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -5878,39 +5876,24 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
template is instantiated. But, if DECL is a variable constant template is instantiated. But, if DECL is a variable constant
then it can be used in future constant expressions, so its value then it can be used in future constant expressions, so its value
must be available. */ must be available. */
if (!(init if (init
&& DECL_CLASS_SCOPE_P (decl) && init_const_expr_p
/* We just set TREE_CONSTANT appropriately; see above. */ && !type_dependent_p
&& TREE_CONSTANT (decl) && decl_maybe_constant_var_p (decl)
&& !type_dependent_p && !value_dependent_init_p (init))
/* FIXME non-value-dependent constant expression */ {
&& !value_dependent_init_p (init))) tree init_code = check_initializer (decl, init, flags, &cleanup);
{ if (init_code == NULL_TREE)
if (init) init = NULL_TREE;
DECL_INITIAL (decl) = init;
if (TREE_CODE (decl) == VAR_DECL
&& !DECL_PRETTY_FUNCTION_P (decl)
&& !type_dependent_p)
maybe_deduce_size_from_array_init (decl, init);
goto finish_end;
} }
else if (TREE_CODE (decl) == VAR_DECL
&& !DECL_PRETTY_FUNCTION_P (decl)
&& !type_dependent_p)
maybe_deduce_size_from_array_init (decl, init);
if (TREE_CODE (init) == TREE_LIST) if (init)
{ DECL_INITIAL (decl) = init;
/* If the parenthesized-initializer form was used (e.g., return;
"int A<N>::i(X)"), then INIT will be a TREE_LIST of initializer
arguments. (There is generally only one.) We convert them
individually. */
tree list = init;
for (; list; list = TREE_CHAIN (list))
{
tree elt = TREE_VALUE (list);
TREE_VALUE (list) = fold_non_dependent_expr (elt);
}
}
else
init = fold_non_dependent_expr (init);
processing_template_decl = 0;
} }
/* Take care of TYPE_DECLs up front. */ /* Take care of TYPE_DECLs up front. */
...@@ -5933,7 +5916,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -5933,7 +5916,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
rest_of_decl_compilation (decl, DECL_FILE_SCOPE_P (decl), rest_of_decl_compilation (decl, DECL_FILE_SCOPE_P (decl),
at_eof); at_eof);
goto finish_end; return;
} }
/* A reference will be modified here, as it is initialized. */ /* A reference will be modified here, as it is initialized. */
...@@ -6057,8 +6040,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -6057,8 +6040,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
else if (TREE_CODE (type) == ARRAY_TYPE) else if (TREE_CODE (type) == ARRAY_TYPE)
layout_type (type); layout_type (type);
if (!processing_template_decl if (TREE_STATIC (decl)
&& TREE_STATIC (decl)
&& !at_function_scope_p () && !at_function_scope_p ()
&& current_function_decl == NULL) && current_function_decl == NULL)
/* So decl is a global variable or a static member of a /* So decl is a global variable or a static member of a
...@@ -6078,9 +6060,8 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -6078,9 +6060,8 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
/* Let the middle end know about variables and functions -- but not /* Let the middle end know about variables and functions -- but not
static data members in uninstantiated class templates. */ static data members in uninstantiated class templates. */
if (!saved_processing_template_decl if (TREE_CODE (decl) == VAR_DECL
&& (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
|| TREE_CODE (decl) == FUNCTION_DECL))
{ {
if (TREE_CODE (decl) == VAR_DECL) if (TREE_CODE (decl) == VAR_DECL)
{ {
...@@ -6167,9 +6148,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, ...@@ -6167,9 +6148,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
if (cleanup) if (cleanup)
push_cleanup (decl, cleanup, false); push_cleanup (decl, cleanup, false);
finish_end:
processing_template_decl = saved_processing_template_decl;
if (was_readonly) if (was_readonly)
TREE_READONLY (decl) = 1; TREE_READONLY (decl) = 1;
} }
......
2011-04-20 Jason Merrill <jason@redhat.com>
* g++.dg/template/const4.C: New.
2011-04-20 Easwaran Raman <eraman@google.com> 2011-04-20 Easwaran Raman <eraman@google.com>
* gcc.dg/stack-layout-1.c: New test. * gcc.dg/stack-layout-1.c: New test.
......
// PR c++/48657
template<unsigned> struct A { typedef int T; };
template<unsigned> void f()
{
const unsigned D = 4;
A<D>::T t;
}
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