mirror of git://gcc.gnu.org/git/gcc.git
re PR c++/48780 ([C++0x] scoped enumerations and va_arg (default argument promotions))
PR c++/48780 * typeck.c (perform_integral_promotions): Don't promote scoped enums. * call.c (convert_arg_to_ellipsis): Promote them here in old ABI. From-SVN: r174751
This commit is contained in:
parent
c074d74021
commit
3c395ecf7d
|
@ -1,3 +1,9 @@
|
||||||
|
2011-06-06 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
PR c++/48780
|
||||||
|
* typeck.c (perform_integral_promotions): Don't promote scoped enums.
|
||||||
|
* call.c (convert_arg_to_ellipsis): Promote them here in old ABI.
|
||||||
|
|
||||||
2011-06-06 Nicola Pero <nicola.pero@meta-innovation.com>,
|
2011-06-06 Nicola Pero <nicola.pero@meta-innovation.com>,
|
||||||
|
|
||||||
PR obj-c++/48275
|
PR obj-c++/48275
|
||||||
|
|
|
@ -5896,7 +5896,15 @@ convert_arg_to_ellipsis (tree arg)
|
||||||
else if (NULLPTR_TYPE_P (arg_type))
|
else if (NULLPTR_TYPE_P (arg_type))
|
||||||
arg = null_pointer_node;
|
arg = null_pointer_node;
|
||||||
else if (INTEGRAL_OR_ENUMERATION_TYPE_P (arg_type))
|
else if (INTEGRAL_OR_ENUMERATION_TYPE_P (arg_type))
|
||||||
arg = perform_integral_promotions (arg);
|
{
|
||||||
|
if (SCOPED_ENUM_P (arg_type) && !abi_version_at_least (6))
|
||||||
|
{
|
||||||
|
warning (OPT_Wabi, "scoped enum %qT will not promote to an "
|
||||||
|
"integral type in a future version of GCC", arg_type);
|
||||||
|
arg = cp_convert (ENUM_UNDERLYING_TYPE (arg_type), arg);
|
||||||
|
}
|
||||||
|
arg = perform_integral_promotions (arg);
|
||||||
|
}
|
||||||
|
|
||||||
arg = require_complete_type (arg);
|
arg = require_complete_type (arg);
|
||||||
arg_type = TREE_TYPE (arg);
|
arg_type = TREE_TYPE (arg);
|
||||||
|
|
|
@ -1616,7 +1616,8 @@ type_promotes_to (tree type)
|
||||||
if (TREE_CODE (type) == BOOLEAN_TYPE)
|
if (TREE_CODE (type) == BOOLEAN_TYPE)
|
||||||
type = integer_type_node;
|
type = integer_type_node;
|
||||||
|
|
||||||
/* scoped enums don't promote. */
|
/* Scoped enums don't promote, but pretend they do for backward ABI bug
|
||||||
|
compatibility wrt varargs. */
|
||||||
else if (SCOPED_ENUM_P (type) && abi_version_at_least (6))
|
else if (SCOPED_ENUM_P (type) && abi_version_at_least (6))
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
@ -1953,6 +1953,9 @@ perform_integral_promotions (tree expr)
|
||||||
if (!type || TREE_CODE (type) != ENUMERAL_TYPE)
|
if (!type || TREE_CODE (type) != ENUMERAL_TYPE)
|
||||||
type = TREE_TYPE (expr);
|
type = TREE_TYPE (expr);
|
||||||
gcc_assert (INTEGRAL_OR_ENUMERATION_TYPE_P (type));
|
gcc_assert (INTEGRAL_OR_ENUMERATION_TYPE_P (type));
|
||||||
|
/* Scoped enums don't promote. */
|
||||||
|
if (SCOPED_ENUM_P (type))
|
||||||
|
return expr;
|
||||||
promoted_type = type_promotes_to (type);
|
promoted_type = type_promotes_to (type);
|
||||||
if (type != promoted_type)
|
if (type != promoted_type)
|
||||||
expr = cp_convert (promoted_type, expr);
|
expr = cp_convert (promoted_type, expr);
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2011-06-06 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
* g++.dg/cpp0x/enum19.C: New.
|
||||||
|
|
||||||
2011-06-07 Sergey Grechanik <mouseentity@ispras.ru>
|
2011-06-07 Sergey Grechanik <mouseentity@ispras.ru>
|
||||||
|
|
||||||
* gcc.target/arm/neon-reload-class.c: New test.
|
* gcc.target/arm/neon-reload-class.c: New test.
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
// We shouldn't give an ABI warning about promotion in switch.
|
||||||
|
// { dg-options "-std=c++0x -fabi-version=5 -Wabi" }
|
||||||
|
|
||||||
|
enum class Foo { X };
|
||||||
|
void test(Foo val)
|
||||||
|
{
|
||||||
|
switch(val)
|
||||||
|
{
|
||||||
|
case Foo::X:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue