diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0086-PR-c-48450.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0086-PR-c-48450.patch | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0086-PR-c-48450.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0086-PR-c-48450.patch new file mode 100644 index 000000000..51906cff8 --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0086-PR-c-48450.patch @@ -0,0 +1,80 @@ +From a5e7415bfbe41941768106dc5819bf3fff1b8435 Mon Sep 17 00:00:00 2001 +From: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Fri, 8 Apr 2011 15:01:50 +0000 +Subject: [PATCH 086/200] PR c++/48450 + * c-family/c-common.c (c_common_truthvalue_conversion): Don't ignore + conversion from C++0x scoped enum. + * cp/cvt.c (ocp_convert): Handle converting scoped enum to bool. + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172191 138bc75d-0d04-0410-961f-82ee72b054a4 + +index c0c01b2..0be3996 100644 +--- a/gcc/c-family/c-common.c ++++ b/gcc/c-family/c-common.c +@@ -3938,16 +3938,25 @@ c_common_truthvalue_conversion (location_t location, tree expr) + } + + CASE_CONVERT: +- /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE, +- since that affects how `default_conversion' will behave. */ +- if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE +- || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE) +- break; +- /* If this is widening the argument, we can ignore it. */ +- if (TYPE_PRECISION (TREE_TYPE (expr)) +- >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0)))) +- return c_common_truthvalue_conversion (location, +- TREE_OPERAND (expr, 0)); ++ { ++ tree totype = TREE_TYPE (expr); ++ tree fromtype = TREE_TYPE (TREE_OPERAND (expr, 0)); ++ ++ /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE, ++ since that affects how `default_conversion' will behave. */ ++ if (TREE_CODE (totype) == REFERENCE_TYPE ++ || TREE_CODE (fromtype) == REFERENCE_TYPE) ++ break; ++ /* Don't strip a conversion from C++0x scoped enum, since they ++ don't implicitly convert to other types. */ ++ if (TREE_CODE (fromtype) == ENUMERAL_TYPE ++ && ENUM_IS_SCOPED (fromtype)) ++ break; ++ /* If this isn't narrowing the argument, we can ignore it. */ ++ if (TYPE_PRECISION (totype) >= TYPE_PRECISION (fromtype)) ++ return c_common_truthvalue_conversion (location, ++ TREE_OPERAND (expr, 0)); ++ } + break; + + case MODIFY_EXPR: +index 8ab0001..290b926 100644 +--- a/gcc/cp/cvt.c ++++ b/gcc/cp/cvt.c +@@ -727,7 +727,13 @@ ocp_convert (tree type, tree expr, int convtype, int flags) + return error_mark_node; + } + if (code == BOOLEAN_TYPE) +- return cp_truthvalue_conversion (e); ++ { ++ /* We can't implicitly convert a scoped enum to bool, so convert ++ to the underlying type first. */ ++ if (SCOPED_ENUM_P (intype) && (convtype & CONV_STATIC)) ++ e = convert (ENUM_UNDERLYING_TYPE (intype), e); ++ return cp_truthvalue_conversion (e); ++ } + + converted = fold_if_not_in_template (convert_to_integer (type, e)); + +new file mode 100644 +index 0000000..10e510b +--- /dev/null ++++ b/gcc/testsuite/g++.dg/cpp0x/enum9.C +@@ -0,0 +1,5 @@ ++// { dg-options -std=c++0x } ++ ++enum class E { }; ++E f(); ++bool b2 = static_cast<bool>(f()); +-- +1.7.0.4 + |