diff options
author | Jason Merrill <jason@redhat.com> | 2011-04-07 17:47:03 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-04-07 17:47:03 -0400 |
commit | 6cdb14286db4ace59759757ce2b1fab2d03a04c2 (patch) | |
tree | dc38818ae6c5a4ea6506df3e61e93dfad7a4d25e | |
parent | 5b97c77f8caedb9434ef5feab416154403d24123 (diff) | |
download | gcc-6cdb14286db4ace59759757ce2b1fab2d03a04c2.zip gcc-6cdb14286db4ace59759757ce2b1fab2d03a04c2.tar.gz gcc-6cdb14286db4ace59759757ce2b1fab2d03a04c2.tar.bz2 |
semantics.c (finish_decltype_type): Simplify handling of unknown type.
* semantics.c (finish_decltype_type): Simplify handling of unknown
type.
From-SVN: r172140
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 41 |
2 files changed, 12 insertions, 32 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b9c94ac..e194e33 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-04-07 Jason Merrill <jason@redhat.com> + * semantics.c (finish_decltype_type): Simplify handling of unknown + type. + * semantics.c (finish_decltype_type): Add complain parm. * cp-tree.h: Adjust. * parser.c (cp_parser_decltype): Adjust. diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 80ec028..5cbba33 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -4788,7 +4788,6 @@ tree finish_decltype_type (tree expr, bool id_expression_or_member_access_p, tsubst_flags_t complain) { - tree orig_expr = expr; tree type = NULL_TREE; if (!expr || error_operand_p (expr)) @@ -4826,6 +4825,13 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p, expr = resolve_nondeduced_context (expr); + if (type_unknown_p (expr)) + { + if (complain & tf_error) + error ("decltype cannot resolve address of overloaded function"); + return error_mark_node; + } + /* To get the size of a static data member declared as an array of unknown bound, we need to instantiate it. */ if (TREE_CODE (expr) == VAR_DECL @@ -4855,28 +4861,9 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p, expr = TREE_OPERAND (expr, 1); if (TREE_CODE (expr) == BASELINK) - /* See through BASELINK nodes to the underlying functions. */ + /* See through BASELINK nodes to the underlying function. */ expr = BASELINK_FUNCTIONS (expr); - if (TREE_CODE (expr) == TEMPLATE_ID_EXPR) - expr = TREE_OPERAND (expr, 0); - - if (TREE_CODE (expr) == OVERLOAD) - { - if (OVL_CHAIN (expr) - || TREE_CODE (OVL_FUNCTION (expr)) == TEMPLATE_DECL) - { - if (complain & tf_error) - error ("%qE refers to a set of overloaded functions", - orig_expr); - return error_mark_node; - } - else - /* An overload set containing only one function: just look - at that function. */ - expr = OVL_FUNCTION (expr); - } - switch (TREE_CODE (expr)) { case FIELD_DECL: @@ -4918,10 +4905,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p, break; default: - gcc_assert (TYPE_P (expr) || DECL_P (expr) - || TREE_CODE (expr) == SCOPE_REF); - if (complain & tf_error) - error ("argument to decltype must be an expression"); + gcc_unreachable (); return error_mark_node; } } @@ -4957,13 +4941,6 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p, } } - if (!type || type == unknown_type_node) - { - if (complain & tf_error) - error ("type of %qE is unknown", expr); - return error_mark_node; - } - return type; } |