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>,
|
||||
|
||||
PR obj-c++/48275
|
||||
|
|
|
@ -5896,7 +5896,15 @@ convert_arg_to_ellipsis (tree arg)
|
|||
else if (NULLPTR_TYPE_P (arg_type))
|
||||
arg = null_pointer_node;
|
||||
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_type = TREE_TYPE (arg);
|
||||
|
|
|
@ -1616,7 +1616,8 @@ type_promotes_to (tree type)
|
|||
if (TREE_CODE (type) == BOOLEAN_TYPE)
|
||||
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))
|
||||
;
|
||||
|
||||
|
|
|
@ -1953,6 +1953,9 @@ perform_integral_promotions (tree expr)
|
|||
if (!type || TREE_CODE (type) != ENUMERAL_TYPE)
|
||||
type = TREE_TYPE (expr);
|
||||
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);
|
||||
if (type != promoted_type)
|
||||
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>
|
||||
|
||||
* 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