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