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