diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0087-semantics.c-finish_decltype_type-Add-complain-parm.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0087-semantics.c-finish_decltype_type-Add-complain-parm.patch | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0087-semantics.c-finish_decltype_type-Add-complain-parm.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0087-semantics.c-finish_decltype_type-Add-complain-parm.patch new file mode 100644 index 000000000..6ff727945 --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0087-semantics.c-finish_decltype_type-Add-complain-parm.patch @@ -0,0 +1,132 @@ +From 2f7a2d284d42cfbff01ee024af4cbaeaff766ee5 Mon Sep 17 00:00:00 2001 +From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Fri, 8 Apr 2011 15:02:00 +0000 +Subject: [PATCH 087/200] * semantics.c (finish_decltype_type): Add complain parm. + * cp-tree.h: Adjust. + * parser.c (cp_parser_decltype): Adjust. + * pt.c (tsubst): Adjust. + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172192 138bc75d-0d04-0410-961f-82ee72b054a4 + +index 4b49046..176a4b8 100644 +--- a/gcc/cp/cp-tree.h ++++ b/gcc/cp/cp-tree.h +@@ -5344,7 +5344,7 @@ extern tree baselink_for_fns (tree); + extern void finish_static_assert (tree, tree, location_t, + bool); + extern tree describable_type (tree); +-extern tree finish_decltype_type (tree, bool); ++extern tree finish_decltype_type (tree, bool, tsubst_flags_t); + extern tree finish_trait_expr (enum cp_trait_kind, tree, tree); + extern tree build_lambda_expr (void); + extern tree build_lambda_object (tree); +diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c +index 4260f6d..daba2fc 100644 +--- a/gcc/cp/parser.c ++++ b/gcc/cp/parser.c +@@ -10457,7 +10457,8 @@ cp_parser_decltype (cp_parser *parser) + return error_mark_node; + } + +- return finish_decltype_type (expr, id_expression_or_member_access_p); ++ return finish_decltype_type (expr, id_expression_or_member_access_p, ++ tf_warning_or_error); + } + + /* Special member functions [gram.special] */ +diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c +index e716ca6..ed48203 100644 +--- a/gcc/cp/pt.c ++++ b/gcc/cp/pt.c +@@ -11025,7 +11025,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) + type = lambda_return_type (type); + else + type = finish_decltype_type +- (type, DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t)); ++ (type, DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (t), complain); + return cp_build_qualified_type_real (type, + cp_type_quals (t) + | cp_type_quals (type), +diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c +index c88b4bb..3a85ddb 100644 +--- a/gcc/cp/semantics.c ++++ b/gcc/cp/semantics.c +@@ -4785,7 +4785,8 @@ describable_type (tree expr) + a full expression. */ + + tree +-finish_decltype_type (tree expr, bool id_expression_or_member_access_p) ++finish_decltype_type (tree expr, bool id_expression_or_member_access_p, ++ tsubst_flags_t complain) + { + tree orig_expr = expr; + tree type = NULL_TREE; +@@ -4798,7 +4799,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p) + || (TREE_CODE (expr) == BIT_NOT_EXPR + && TYPE_P (TREE_OPERAND (expr, 0)))) + { +- error ("argument to decltype must be an expression"); ++ if (complain & tf_error) ++ error ("argument to decltype must be an expression"); + return error_mark_node; + } + +@@ -4865,7 +4867,9 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p) + if (OVL_CHAIN (expr) + || TREE_CODE (OVL_FUNCTION (expr)) == TEMPLATE_DECL) + { +- error ("%qE refers to a set of overloaded functions", orig_expr); ++ if (complain & tf_error) ++ error ("%qE refers to a set of overloaded functions", ++ orig_expr); + return error_mark_node; + } + else +@@ -4917,7 +4921,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p) + default: + gcc_assert (TYPE_P (expr) || DECL_P (expr) + || TREE_CODE (expr) == SCOPE_REF); +- error ("argument to decltype must be an expression"); ++ if (complain & tf_error) ++ error ("argument to decltype must be an expression"); + return error_mark_node; + } + } +@@ -5012,7 +5017,8 @@ finish_decltype_type (tree expr, bool id_expression_or_member_access_p) + + if (!type || type == unknown_type_node) + { +- error ("type of %qE is unknown", expr); ++ if (complain & tf_error) ++ error ("type of %qE is unknown", expr); + return error_mark_node; + } + +new file mode 100644 +index 0000000..0a95a96 +--- /dev/null ++++ b/gcc/testsuite/g++.dg/cpp0x/sfinae7.C +@@ -0,0 +1,20 @@ ++// { dg-options -std=c++0x } ++ ++struct A ++{ ++ void f(); ++ void f(int); ++ typedef int g; ++}; ++ ++template <class T> decltype (T::f) f(); ++template <class T> void f(); ++ ++template <class T> decltype (T::g) g(); ++template <class T> void g(); ++ ++int main() ++{ ++ f<A>(); ++ g<A>(); ++} +-- +1.7.0.4 + |