diff options
author | Jason Merrill <jason@redhat.com> | 2011-04-20 15:39:02 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-04-20 15:39:02 -0400 |
commit | 8efcbecad561cde32bdefe8d08f096e6284ef928 (patch) | |
tree | 2aa1fa90d26579b2a1a0345df2ebd335edf19602 /gcc/cp | |
parent | 4a25752bbd26c53f9c1c821afcfaf4b92ccb0527 (diff) | |
download | gcc-8efcbecad561cde32bdefe8d08f096e6284ef928.zip gcc-8efcbecad561cde32bdefe8d08f096e6284ef928.tar.gz gcc-8efcbecad561cde32bdefe8d08f096e6284ef928.tar.bz2 |
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
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 62 |
2 files changed, 25 insertions, 42 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e854651..ed98719 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +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> * tree.c (cxx_printable_name_internal): Remove useless if-before-free. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 6309648..cf4a40e 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5750,7 +5750,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, const char *asmspec = NULL; int was_readonly = 0; bool var_definition_p = false; - int saved_processing_template_decl; tree auto_node; if (decl == error_mark_node) @@ -5772,7 +5771,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, /* Assume no cleanup is required. */ cleanup = NULL_TREE; - saved_processing_template_decl = processing_template_decl; /* If a name was specified, get the string. */ if (global_scope_p (current_binding_level)) @@ -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 then it can be used in future constant expressions, so its value must be available. */ - if (!(init - && DECL_CLASS_SCOPE_P (decl) - /* We just set TREE_CONSTANT appropriately; see above. */ - && TREE_CONSTANT (decl) - && !type_dependent_p - /* FIXME non-value-dependent constant expression */ - && !value_dependent_init_p (init))) - { - if (init) - 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; + if (init + && init_const_expr_p + && !type_dependent_p + && decl_maybe_constant_var_p (decl) + && !value_dependent_init_p (init)) + { + tree init_code = check_initializer (decl, init, flags, &cleanup); + if (init_code == NULL_TREE) + init = NULL_TREE; } + 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 the parenthesized-initializer form was used (e.g., - "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; + if (init) + DECL_INITIAL (decl) = init; + return; } /* Take care of TYPE_DECLs up front. */ @@ -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), at_eof); - goto finish_end; + return; } /* 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, else if (TREE_CODE (type) == ARRAY_TYPE) layout_type (type); - if (!processing_template_decl - && TREE_STATIC (decl) + if (TREE_STATIC (decl) && !at_function_scope_p () && current_function_decl == NULL) /* 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, /* Let the middle end know about variables and functions -- but not static data members in uninstantiated class templates. */ - if (!saved_processing_template_decl - && (TREE_CODE (decl) == VAR_DECL - || TREE_CODE (decl) == FUNCTION_DECL)) + if (TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == FUNCTION_DECL) { if (TREE_CODE (decl) == VAR_DECL) { @@ -6167,9 +6148,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, if (cleanup) push_cleanup (decl, cleanup, false); - finish_end: - processing_template_decl = saved_processing_template_decl; - if (was_readonly) TREE_READONLY (decl) = 1; } |