diff options
author | Jason Merrill <jason@redhat.com> | 2011-04-07 17:46:57 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-04-07 17:46:57 -0400 |
commit | 5b97c77f8caedb9434ef5feab416154403d24123 (patch) | |
tree | b64c1b85c092e3d9f6bf16001c2ca4d87f53360a | |
parent | 1ee44b260d206b5ebc51466d672adffcdcebf4f2 (diff) | |
download | gcc-5b97c77f8caedb9434ef5feab416154403d24123.zip gcc-5b97c77f8caedb9434ef5feab416154403d24123.tar.gz gcc-5b97c77f8caedb9434ef5feab416154403d24123.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/parser.c | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 2 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/sfinae7.C | 20 |
7 files changed, 42 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5ffe1f5..b9c94ac 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2011-04-07 Jason Merrill <jason@redhat.com> + * 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 6ef6e6e..06b0b3e 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 9ed3a1f..607e9b8 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 5960e46..66db880 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 a15740a..80ec028 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 dabb816..9d5f63d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2011-04-07 Jason Merrill <jason@redhat.com> + * g++.dg/cpp0x/sfinae7.C: New. + * g++.dg/cpp0x/enum9.C: New. 2011-04-07 Mike Stump <mikestump@comcast.net> diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae7.C b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C new file mode 100644 index 0000000..0a95a96 --- /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 <class T> decltype (T::f) f(); +template <class T> void f(); + +template <class T> decltype (T::g) g(); +template <class T> void g(); + +int main() +{ + f<A>(); + g<A>(); +} |