1 From 2f7a2d284d42cfbff01ee024af4cbaeaff766ee5 Mon Sep 17 00:00:00 2001
2 From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
3 Date: Fri, 8 Apr 2011 15:02:00 +0000
4 Subject: [PATCH 087/200] * semantics.c (finish_decltype_type): Add complain parm.
6 * parser.c (cp_parser_decltype): Adjust.
7 * pt.c (tsubst): Adjust.
9 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172192 138bc75d-0d04-0410-961f-82ee72b054a4
11 index 4b49046..176a4b8 100644
12 --- a/gcc/cp/cp-tree.h
13 +++ b/gcc/cp/cp-tree.h
14 @@ -5344,7 +5344,7 @@ extern tree baselink_for_fns (tree);
15 extern void finish_static_assert (tree, tree, location_t,
17 extern tree describable_type (tree);
18 -extern tree finish_decltype_type (tree, bool);
19 +extern tree finish_decltype_type (tree, bool, tsubst_flags_t);
20 extern tree finish_trait_expr (enum cp_trait_kind, tree, tree);
21 extern tree build_lambda_expr (void);
22 extern tree build_lambda_object (tree);
23 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
24 index 4260f6d..daba2fc 100644
27 @@ -10457,7 +10457,8 @@ cp_parser_decltype (cp_parser *parser)
28 return error_mark_node;
31 - return finish_decltype_type (expr, id_expression_or_member_access_p);
32 + return finish_decltype_type (expr, id_expression_or_member_access_p,
33 + tf_warning_or_error);
36 /* Special member functions [gram.special] */
37 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
38 index e716ca6..ed48203 100644
41 @@ -11025,7 +11025,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
42 type = lambda_return_type (type);
44 type = finish_decltype_type
45 - (type, DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t));
46 + (type, DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t), complain);
47 return cp_build_qualified_type_real (type,
49 | cp_type_quals (type),
50 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
51 index c88b4bb..3a85ddb 100644
52 --- a/gcc/cp/semantics.c
53 +++ b/gcc/cp/semantics.c
54 @@ -4785,7 +4785,8 @@ describable_type (tree expr)
58 -finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
59 +finish_decltype_type (tree expr, bool id_expression_or_member_access_p,
60 + tsubst_flags_t complain)
62 tree orig_expr = expr;
63 tree type = NULL_TREE;
64 @@ -4798,7 +4799,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
65 || (TREE_CODE (expr) == BIT_NOT_EXPR
66 && TYPE_P (TREE_OPERAND (expr, 0))))
68 - error ("argument to decltype must be an expression");
69 + if (complain & tf_error)
70 + error ("argument to decltype must be an expression");
71 return error_mark_node;
74 @@ -4865,7 +4867,9 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
76 || TREE_CODE (OVL_FUNCTION (expr)) == TEMPLATE_DECL)
78 - error ("%qE refers to a set of overloaded functions", orig_expr);
79 + if (complain & tf_error)
80 + error ("%qE refers to a set of overloaded functions",
82 return error_mark_node;
85 @@ -4917,7 +4921,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
87 gcc_assert (TYPE_P (expr) || DECL_P (expr)
88 || TREE_CODE (expr) == SCOPE_REF);
89 - error ("argument to decltype must be an expression");
90 + if (complain & tf_error)
91 + error ("argument to decltype must be an expression");
92 return error_mark_node;
95 @@ -5012,7 +5017,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
97 if (!type || type == unknown_type_node)
99 - error ("type of %qE is unknown", expr);
100 + if (complain & tf_error)
101 + error ("type of %qE is unknown", expr);
102 return error_mark_node;
106 index 0000000..0a95a96
108 +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C
110 +// { dg-options -std=c++0x }
119 +template <class T> decltype (T::f) f();
120 +template <class T> void f();
122 +template <class T> decltype (T::g) g();
123 +template <class T> void g();