aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/semantics.c
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2009-10-08 12:09:22 -0400
committerJason Merrill <jason@gcc.gnu.org>2009-10-08 12:09:22 -0400
commitccb05613cfd1d37ce6473244e28c56e75d1d0e66 (patch)
tree0b5aca150e69844718e291632a5913000e0f6868 /gcc/cp/semantics.c
parent6728ee79872ffd3dbcf858dab076c96c71ec95e5 (diff)
downloadgcc-ccb05613cfd1d37ce6473244e28c56e75d1d0e66.zip
gcc-ccb05613cfd1d37ce6473244e28c56e75d1d0e66.tar.gz
gcc-ccb05613cfd1d37ce6473244e28c56e75d1d0e66.tar.bz2
re PR c++/37177 ([c++0x] ICE on decltype(rel_ops::operator><int>);)
PR c++/37177 * pt.c (resolve_nondeduced_context): New. * cvt.c (convert_to_void): Call it. * semantics.c (finish_decltype_type): Likewise. * typeck.c (decay_conversion): Here too. * pt.c (tsubst_decl): Don't clobber input_location. Don't register a bad specialization. From-SVN: r152564
Diffstat (limited to 'gcc/cp/semantics.c')
-rw-r--r--gcc/cp/semantics.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 391228b..6cf2220 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4741,6 +4741,7 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
/* The type denoted by decltype(e) is defined as follows: */
+ expr = resolve_nondeduced_context (expr);
if (id_expression_or_member_access_p)
{
/* If e is an id-expression or a class member access (5.2.5
@@ -4766,9 +4767,13 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
/* See through BASELINK nodes to the underlying functions. */
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))
+ if (OVL_CHAIN (expr)
+ || TREE_CODE (OVL_FUNCTION (expr)) == TEMPLATE_DECL)
{
error ("%qE refers to a set of overloaded functions", orig_expr);
return error_mark_node;