aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-04-07 17:47:03 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-04-07 17:47:03 -0400
commit6cdb14286db4ace59759757ce2b1fab2d03a04c2 (patch)
treedc38818ae6c5a4ea6506df3e61e93dfad7a4d25e /gcc
parent5b97c77f8caedb9434ef5feab416154403d24123 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/semantics.c41
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;
}