From 5b97c77f8caedb9434ef5feab416154403d24123 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 7 Apr 2011 17:46:57 -0400 Subject: [PATCH] semantics.c (finish_decltype_type): Add complain parm. * semantics.c (finish_decltype_type): Add complain parm. * cp-tree.h: Adjust. * parser.c (cp_parser_decltype): Adjust. * pt.c (tsubst): Adjust. From-SVN: r172139 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/cp-tree.h | 2 +- gcc/cp/parser.c | 3 ++- gcc/cp/pt.c | 2 +- gcc/cp/semantics.c | 16 +++++++++++----- gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/cpp0x/sfinae7.C | 20 ++++++++++++++++++++ 7 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/sfinae7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5ffe1f5ed5f..b9c94ac331e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2011-04-07 Jason Merrill + * semantics.c (finish_decltype_type): Add complain parm. + * cp-tree.h: Adjust. + * parser.c (cp_parser_decltype): Adjust. + * pt.c (tsubst): Adjust. + PR c++/48450 * cvt.c (ocp_convert): Handle converting scoped enum to bool. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 6ef6e6eb3ec..06b0b3e8990 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5346,7 +5346,7 @@ extern tree baselink_for_fns (tree); extern void finish_static_assert (tree, tree, location_t, bool); extern tree describable_type (tree); -extern tree finish_decltype_type (tree, bool); +extern tree finish_decltype_type (tree, bool, tsubst_flags_t); extern tree finish_trait_expr (enum cp_trait_kind, tree, tree); extern tree build_lambda_expr (void); extern tree build_lambda_object (tree); diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9ed3a1f7ec4..607e9b8f328 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -10197,7 +10197,8 @@ cp_parser_decltype (cp_parser *parser) return error_mark_node; } - return finish_decltype_type (expr, id_expression_or_member_access_p); + return finish_decltype_type (expr, id_expression_or_member_access_p, + tf_warning_or_error); } /* Special member functions [gram.special] */ diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 5960e4624b6..66db880acd5 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11025,7 +11025,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) type = lambda_return_type (type); else type = finish_decltype_type - (type, DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t)); + (type, DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t), complain); return cp_build_qualified_type_real (type, cp_type_quals (t) | cp_type_quals (type), diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index a15740a81ee..80ec028b9b6 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -4785,7 +4785,8 @@ describable_type (tree expr) a full expression. */ tree -finish_decltype_type (tree expr, bool id_expression_or_member_access_p) +finish_decltype_type (tree expr, bool id_expression_or_member_access_p, + tsubst_flags_t complain) { tree orig_expr = expr; tree type = NULL_TREE; @@ -4798,7 +4799,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p) || (TREE_CODE (expr) == BIT_NOT_EXPR && TYPE_P (TREE_OPERAND (expr, 0)))) { - error ("argument to decltype must be an expression"); + if (complain & tf_error) + error ("argument to decltype must be an expression"); return error_mark_node; } @@ -4864,7 +4866,9 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p) if (OVL_CHAIN (expr) || TREE_CODE (OVL_FUNCTION (expr)) == TEMPLATE_DECL) { - error ("%qE refers to a set of overloaded functions", orig_expr); + if (complain & tf_error) + error ("%qE refers to a set of overloaded functions", + orig_expr); return error_mark_node; } else @@ -4916,7 +4920,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p) default: gcc_assert (TYPE_P (expr) || DECL_P (expr) || TREE_CODE (expr) == SCOPE_REF); - error ("argument to decltype must be an expression"); + if (complain & tf_error) + error ("argument to decltype must be an expression"); return error_mark_node; } } @@ -4954,7 +4959,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p) if (!type || type == unknown_type_node) { - error ("type of %qE is unknown", expr); + if (complain & tf_error) + error ("type of %qE is unknown", expr); return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dabb816393e..9d5f63d1a17 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-04-07 Jason Merrill + * g++.dg/cpp0x/sfinae7.C: New. + * g++.dg/cpp0x/enum9.C: New. 2011-04-07 Mike Stump diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae7.C b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C new file mode 100644 index 00000000000..0a95a9644c7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C @@ -0,0 +1,20 @@ +// { dg-options -std=c++0x } + +struct A +{ + void f(); + void f(int); + typedef int g; +}; + +template decltype (T::f) f(); +template void f(); + +template decltype (T::g) g(); +template void g(); + +int main() +{ + f(); + g(); +} -- 2.30.2