]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/blob
6ff72794515a22f5cd99d3dd1c802b0bed074e5a
[thirdparty/openembedded/openembedded-core-contrib.git] /
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.
5 * cp-tree.h: Adjust.
6 * parser.c (cp_parser_decltype): Adjust.
7 * pt.c (tsubst): Adjust.
8
9 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172192 138bc75d-0d04-0410-961f-82ee72b054a4
10
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,
16 bool);
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
25 --- a/gcc/cp/parser.c
26 +++ b/gcc/cp/parser.c
27 @@ -10457,7 +10457,8 @@ cp_parser_decltype (cp_parser *parser)
28 return error_mark_node;
29 }
30
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);
34 }
35
36 /* Special member functions [gram.special] */
37 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
38 index e716ca6..ed48203 100644
39 --- a/gcc/cp/pt.c
40 +++ b/gcc/cp/pt.c
41 @@ -11025,7 +11025,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
42 type = lambda_return_type (type);
43 else
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,
48 cp_type_quals (t)
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)
55 a full expression. */
56
57 tree
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)
61 {
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))))
67 {
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;
72 }
73
74 @@ -4865,7 +4867,9 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
75 if (OVL_CHAIN (expr)
76 || TREE_CODE (OVL_FUNCTION (expr)) == TEMPLATE_DECL)
77 {
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",
81 + orig_expr);
82 return error_mark_node;
83 }
84 else
85 @@ -4917,7 +4921,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
86 default:
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;
93 }
94 }
95 @@ -5012,7 +5017,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
96
97 if (!type || type == unknown_type_node)
98 {
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;
103 }
104
105 new file mode 100644
106 index 0000000..0a95a96
107 --- /dev/null
108 +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C
109 @@ -0,0 +1,20 @@
110 +// { dg-options -std=c++0x }
111 +
112 +struct A
113 +{
114 + void f();
115 + void f(int);
116 + typedef int g;
117 +};
118 +
119 +template <class T> decltype (T::f) f();
120 +template <class T> void f();
121 +
122 +template <class T> decltype (T::g) g();
123 +template <class T> void g();
124 +
125 +int main()
126 +{
127 + f<A>();
128 + g<A>();
129 +}
130 --
131 1.7.0.4
132