]> code.ossystems Code Review - openembedded-core.git/blob
6ff72794515a22f5cd99d3dd1c802b0bed074e5a
[openembedded-core.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