diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0090-PR-c-48500.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0090-PR-c-48500.patch | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0090-PR-c-48500.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0090-PR-c-48500.patch new file mode 100644 index 0000000..74f0afa --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0090-PR-c-48500.patch @@ -0,0 +1,145 @@ +From c9ec81bbd73666b97ab9049b759b5ab8d0e06681 Mon Sep 17 00:00:00 2001 +From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Fri, 8 Apr 2011 15:02:28 +0000 +Subject: [PATCH 090/200] PR c++/48500 + * semantics.c (potential_constant_expression_1) [CALL_EXPR]: Check + arguments even if we don't know the function. + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172195 138bc75d-0d04-0410-961f-82ee72b054a4 + +index 3a85ddb..e6bb1dc 100644 +--- a/gcc/cp/semantics.c ++++ b/gcc/cp/semantics.c +@@ -7374,6 +7374,8 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) + class member access expression, including the result of the + implicit transformation in the body of the non-static + member function (9.3.1); */ ++ /* FIXME this restriction seems pointless since the standard dropped ++ "potential constant expression". */ + if (is_this_parameter (t)) + { + if (flags & tf_error) +@@ -7389,51 +7391,63 @@ potential_constant_expression_1 (tree t, bool want_rval, tsubst_flags_t flags) + { + tree fun = get_function_named_in_call (t); + const int nargs = call_expr_nargs (t); +- if (TREE_CODE (fun) != FUNCTION_DECL) +- { +- if (potential_constant_expression_1 (fun, rval, flags)) +- /* Might end up being a constant function pointer. */ +- return true; +- if (flags & tf_error) +- error ("%qE is not a function name", fun); +- return false; +- } +- /* Skip initial arguments to base constructors. */ +- if (DECL_BASE_CONSTRUCTOR_P (fun)) +- i = num_artificial_parms_for (fun); ++ i = 0; ++ ++ if (is_overloaded_fn (fun)) ++ { ++ if (TREE_CODE (fun) == FUNCTION_DECL) ++ { ++ if (builtin_valid_in_constant_expr_p (fun)) ++ return true; ++ if (!DECL_DECLARED_CONSTEXPR_P (fun) ++ && !morally_constexpr_builtin_function_p (fun)) ++ { ++ if (flags & tf_error) ++ error ("%qD is not %<constexpr%>", fun); ++ return false; ++ } ++ /* A call to a non-static member function takes the address ++ of the object as the first argument. But in a constant ++ expression the address will be folded away, so look ++ through it now. */ ++ if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun) ++ && !DECL_CONSTRUCTOR_P (fun)) ++ { ++ tree x = get_nth_callarg (t, 0); ++ if (is_this_parameter (x)) ++ /* OK. */; ++ else if (!potential_constant_expression_1 (x, rval, flags)) ++ { ++ if (flags & tf_error) ++ error ("object argument is not a potential " ++ "constant expression"); ++ return false; ++ } ++ i = 1; ++ } ++ } ++ else ++ fun = get_first_fn (fun); ++ /* Skip initial arguments to base constructors. */ ++ if (DECL_BASE_CONSTRUCTOR_P (fun)) ++ i = num_artificial_parms_for (fun); ++ fun = DECL_ORIGIN (fun); ++ } + else +- i = 0; +- fun = DECL_ORIGIN (fun); +- if (builtin_valid_in_constant_expr_p (fun)) +- return true; +- if (!DECL_DECLARED_CONSTEXPR_P (fun) +- && !morally_constexpr_builtin_function_p (fun)) + { +- if (flags & tf_error) +- error ("%qD is not %<constexpr%>", fun); +- return false; ++ if (potential_constant_expression_1 (fun, rval, flags)) ++ /* Might end up being a constant function pointer. */; ++ else ++ { ++ if (flags & tf_error) ++ error ("%qE is not a function name", fun); ++ return false; ++ } + } + for (; i < nargs; ++i) + { + tree x = get_nth_callarg (t, i); +- /* A call to a non-static member function takes the +- address of the object as the first argument. +- But in a constant expression the address will be folded +- away, so look through it now. */ +- if (i == 0 && DECL_NONSTATIC_MEMBER_P (fun) +- && !DECL_CONSTRUCTOR_P (fun)) +- { +- if (is_this_parameter (x)) +- /* OK. */; +- else if (!potential_constant_expression_1 (x, rval, flags)) +- { +- if (flags & tf_error) +- error ("object argument is not a potential constant " +- "expression"); +- return false; +- } +- } +- else if (!potential_constant_expression_1 (x, rval, flags)) ++ if (!potential_constant_expression_1 (x, rval, flags)) + { + if (flags & tf_error) + error ("argument in position %qP is not a " +new file mode 100644 +index 0000000..833318b +--- /dev/null ++++ b/gcc/testsuite/g++.dg/cpp0x/regress/call1.C +@@ -0,0 +1,13 @@ ++// PR c++/48500 ++// { dg-options -std=c++0x } ++ ++struct linked_ptr { ++}; ++template <typename T> linked_ptr make_linked_ptr(T* ptr); ++struct Concrete; ++struct NewedClass { ++ NewedClass(const Concrete& req){} ++}; ++template<typename ArgT> void AddObjToChange(const ArgT& req) { ++ linked_ptr p = make_linked_ptr(new NewedClass(req)); ++} +-- +1.7.0.4 + |