mirror of git://gcc.gnu.org/git/gcc.git
re PR c++/48771 ([C++0x] is_literal_type incorrect for references to non-literal types)
/cp 2011-04-28 Paolo Carlini <paolo.carlini@oracle.com> PR c++/48771 * semantics.c (literal_type_p): Reference types are literal types, per the FDIS. (valid_type_in_constexpr_fundecl_p): Remove. (is_valid_constexpr_fn): Adjust. /testsuite 2011-04-28 Paolo Carlini <paolo.carlini@oracle.com> PR c++/48771 * g++.dg/ext/is_literal_type1.C: New. From-SVN: r173062
This commit is contained in:
parent
8576f20aed
commit
83b6b866e6
|
@ -1,3 +1,11 @@
|
|||
2011-04-28 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/48771
|
||||
* semantics.c (literal_type_p): Reference types are literal types,
|
||||
per the FDIS.
|
||||
(valid_type_in_constexpr_fundecl_p): Remove.
|
||||
(is_valid_constexpr_fn): Adjust.
|
||||
|
||||
2011-04-27 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR libstdc++/48760
|
||||
|
|
|
@ -5331,7 +5331,8 @@ float_const_decimal64_p (void)
|
|||
bool
|
||||
literal_type_p (tree t)
|
||||
{
|
||||
if (SCALAR_TYPE_P (t))
|
||||
if (SCALAR_TYPE_P (t)
|
||||
|| TREE_CODE (t) == REFERENCE_TYPE)
|
||||
return true;
|
||||
if (CLASS_TYPE_P (t))
|
||||
return CLASSTYPE_LITERAL_P (t);
|
||||
|
@ -5406,18 +5407,6 @@ retrieve_constexpr_fundef (tree fun)
|
|||
return (constexpr_fundef *) htab_find (constexpr_fundef_table, &fundef);
|
||||
}
|
||||
|
||||
/* Return true if type expression T is a valid parameter type, or
|
||||
a valid return type, of a constexpr function. */
|
||||
|
||||
static bool
|
||||
valid_type_in_constexpr_fundecl_p (tree t)
|
||||
{
|
||||
return (literal_type_p (t)
|
||||
/* FIXME we allow ref to non-literal; should change standard to
|
||||
match, or change back if not. */
|
||||
|| TREE_CODE (t) == REFERENCE_TYPE);
|
||||
}
|
||||
|
||||
/* Check whether the parameter and return types of FUN are valid for a
|
||||
constexpr function, and complain if COMPLAIN. */
|
||||
|
||||
|
@ -5427,7 +5416,7 @@ is_valid_constexpr_fn (tree fun, bool complain)
|
|||
tree parm = FUNCTION_FIRST_USER_PARM (fun);
|
||||
bool ret = true;
|
||||
for (; parm != NULL; parm = TREE_CHAIN (parm))
|
||||
if (!valid_type_in_constexpr_fundecl_p (TREE_TYPE (parm)))
|
||||
if (!literal_type_p (TREE_TYPE (parm)))
|
||||
{
|
||||
ret = false;
|
||||
if (complain)
|
||||
|
@ -5438,7 +5427,7 @@ is_valid_constexpr_fn (tree fun, bool complain)
|
|||
if (!DECL_CONSTRUCTOR_P (fun))
|
||||
{
|
||||
tree rettype = TREE_TYPE (TREE_TYPE (fun));
|
||||
if (!valid_type_in_constexpr_fundecl_p (rettype))
|
||||
if (!literal_type_p (rettype))
|
||||
{
|
||||
ret = false;
|
||||
if (complain)
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2011-04-28 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
PR c++/48771
|
||||
* g++.dg/ext/is_literal_type1.C: New.
|
||||
|
||||
2011-04-28 Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
PR fortran/48112
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
// PR c++/48771
|
||||
// { dg-do compile }
|
||||
// { dg-options "-std=c++0x" }
|
||||
|
||||
struct NonLiteral {
|
||||
NonLiteral();
|
||||
~NonLiteral();
|
||||
};
|
||||
|
||||
static_assert(__is_literal_type(NonLiteral&), "Error");
|
||||
static_assert(__is_literal_type(NonLiteral&&), "Error");
|
Loading…
Reference in New Issue