mirror of git://gcc.gnu.org/git/gcc.git
re PR c++/51912 ([C++11] G++ accepts floating point case labels)
/cp 2013-08-14 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51912 * cp-tree.h (LOOKUP_NO_NON_INTEGRAL): Add. * decl.c (case_conversion): Use it. * call.c (standard_conversion): Likewise. (implicit_conversion): Adjust. /testsuite 2013-08-14 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51912 * g++.dg/cpp0x/enum28.C: New. * g++.dg/cpp0x/enum15.C: Adjust. From-SVN: r201754
This commit is contained in:
parent
1869217f88
commit
715a572a8a
|
|
@ -1,3 +1,11 @@
|
||||||
|
2013-08-14 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
|
PR c++/51912
|
||||||
|
* cp-tree.h (LOOKUP_NO_NON_INTEGRAL): Add.
|
||||||
|
* decl.c (case_conversion): Use it.
|
||||||
|
* call.c (standard_conversion): Likewise.
|
||||||
|
(implicit_conversion): Adjust.
|
||||||
|
|
||||||
2013-08-13 Adam Butcher <adam@jessamine.co.uk>
|
2013-08-13 Adam Butcher <adam@jessamine.co.uk>
|
||||||
|
|
||||||
* pt.c: Grammar fix in comments ("it's" to "its").
|
* pt.c: Grammar fix in comments ("it's" to "its").
|
||||||
|
|
|
||||||
|
|
@ -1314,7 +1314,8 @@ standard_conversion (tree to, tree from, tree expr, bool c_cast_p,
|
||||||
/* As an extension, allow conversion to complex type. */
|
/* As an extension, allow conversion to complex type. */
|
||||||
else if (ARITHMETIC_TYPE_P (to))
|
else if (ARITHMETIC_TYPE_P (to))
|
||||||
{
|
{
|
||||||
if (! (INTEGRAL_CODE_P (fcode) || fcode == REAL_TYPE)
|
if (! (INTEGRAL_CODE_P (fcode)
|
||||||
|
|| (fcode == REAL_TYPE && !(flags & LOOKUP_NO_NON_INTEGRAL)))
|
||||||
|| SCOPED_ENUM_P (from))
|
|| SCOPED_ENUM_P (from))
|
||||||
return NULL;
|
return NULL;
|
||||||
conv = build_conv (ck_std, to, conv);
|
conv = build_conv (ck_std, to, conv);
|
||||||
|
|
@ -1681,7 +1682,7 @@ implicit_conversion (tree to, tree from, tree expr, bool c_cast_p,
|
||||||
resolution, or after we've chosen one. */
|
resolution, or after we've chosen one. */
|
||||||
flags &= (LOOKUP_ONLYCONVERTING|LOOKUP_NO_CONVERSION|LOOKUP_COPY_PARM
|
flags &= (LOOKUP_ONLYCONVERTING|LOOKUP_NO_CONVERSION|LOOKUP_COPY_PARM
|
||||||
|LOOKUP_NO_TEMP_BIND|LOOKUP_NO_RVAL_BIND|LOOKUP_PREFER_RVALUE
|
|LOOKUP_NO_TEMP_BIND|LOOKUP_NO_RVAL_BIND|LOOKUP_PREFER_RVALUE
|
||||||
|LOOKUP_NO_NARROWING|LOOKUP_PROTECT);
|
|LOOKUP_NO_NARROWING|LOOKUP_PROTECT|LOOKUP_NO_NON_INTEGRAL);
|
||||||
|
|
||||||
/* FIXME: actually we don't want warnings either, but we can't just
|
/* FIXME: actually we don't want warnings either, but we can't just
|
||||||
have 'complain &= ~(tf_warning|tf_error)' because it would cause
|
have 'complain &= ~(tf_warning|tf_error)' because it would cause
|
||||||
|
|
|
||||||
|
|
@ -4510,6 +4510,8 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, TYPENAME_FLAG };
|
||||||
#define LOOKUP_EXPLICIT_TMPL_ARGS (LOOKUP_ALREADY_DIGESTED << 1)
|
#define LOOKUP_EXPLICIT_TMPL_ARGS (LOOKUP_ALREADY_DIGESTED << 1)
|
||||||
/* Like LOOKUP_NO_TEMP_BIND, but also prevent binding to xvalues. */
|
/* Like LOOKUP_NO_TEMP_BIND, but also prevent binding to xvalues. */
|
||||||
#define LOOKUP_NO_RVAL_BIND (LOOKUP_EXPLICIT_TMPL_ARGS << 1)
|
#define LOOKUP_NO_RVAL_BIND (LOOKUP_EXPLICIT_TMPL_ARGS << 1)
|
||||||
|
/* Used by case_conversion to disregard non-integral conversions. */
|
||||||
|
#define LOOKUP_NO_NON_INTEGRAL (LOOKUP_NO_RVAL_BIND << 1)
|
||||||
|
|
||||||
#define LOOKUP_NAMESPACES_ONLY(F) \
|
#define LOOKUP_NAMESPACES_ONLY(F) \
|
||||||
(((F) & LOOKUP_PREFER_NAMESPACES) && !((F) & LOOKUP_PREFER_TYPES))
|
(((F) & LOOKUP_PREFER_NAMESPACES) && !((F) & LOOKUP_PREFER_TYPES))
|
||||||
|
|
|
||||||
|
|
@ -3103,7 +3103,9 @@ case_conversion (tree type, tree value)
|
||||||
{
|
{
|
||||||
if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type))
|
if (INTEGRAL_OR_UNSCOPED_ENUMERATION_TYPE_P (type))
|
||||||
type = type_promotes_to (type);
|
type = type_promotes_to (type);
|
||||||
value = perform_implicit_conversion (type, value, tf_warning_or_error);
|
value = (perform_implicit_conversion_flags
|
||||||
|
(type, value, tf_warning_or_error,
|
||||||
|
LOOKUP_IMPLICIT | LOOKUP_NO_NON_INTEGRAL));
|
||||||
}
|
}
|
||||||
return cxx_constant_value (value);
|
return cxx_constant_value (value);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
|
2013-08-14 Paolo Carlini <paolo.carlini@oracle.com>
|
||||||
|
|
||||||
|
PR c++/51912
|
||||||
|
* g++.dg/cpp0x/enum28.C: New.
|
||||||
|
* g++.dg/cpp0x/enum15.C: Adjust.
|
||||||
|
|
||||||
2013-08-14 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
2013-08-14 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
||||||
|
|
||||||
PR target/57949
|
PR target/57949
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,6 @@ void foo (A a, int i)
|
||||||
{
|
{
|
||||||
case A::Val0: break; // { dg-error "" }
|
case A::Val0: break; // { dg-error "" }
|
||||||
case 1: break;
|
case 1: break;
|
||||||
case 2.0: break;
|
case 2.0: break; // { dg-error "" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
// PR c++/51912
|
||||||
|
// { dg-do compile { target c++11 } }
|
||||||
|
|
||||||
|
constexpr double g() { return 2.0; }
|
||||||
|
|
||||||
|
void f(int i)
|
||||||
|
{
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case 1.0:; // { dg-error "could not convert" }
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case g():; // { dg-error "could not convert" }
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue