Commit 83b6b866 by Paolo Carlini Committed by Paolo Carlini

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
parent 8576f20a
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> 2011-04-27 Jason Merrill <jason@redhat.com>
PR libstdc++/48760 PR libstdc++/48760
......
...@@ -5331,7 +5331,8 @@ float_const_decimal64_p (void) ...@@ -5331,7 +5331,8 @@ float_const_decimal64_p (void)
bool bool
literal_type_p (tree t) literal_type_p (tree t)
{ {
if (SCALAR_TYPE_P (t)) if (SCALAR_TYPE_P (t)
|| TREE_CODE (t) == REFERENCE_TYPE)
return true; return true;
if (CLASS_TYPE_P (t)) if (CLASS_TYPE_P (t))
return CLASSTYPE_LITERAL_P (t); return CLASSTYPE_LITERAL_P (t);
...@@ -5406,18 +5407,6 @@ retrieve_constexpr_fundef (tree fun) ...@@ -5406,18 +5407,6 @@ retrieve_constexpr_fundef (tree fun)
return (constexpr_fundef *) htab_find (constexpr_fundef_table, &fundef); 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 /* Check whether the parameter and return types of FUN are valid for a
constexpr function, and complain if COMPLAIN. */ constexpr function, and complain if COMPLAIN. */
...@@ -5427,7 +5416,7 @@ is_valid_constexpr_fn (tree fun, bool complain) ...@@ -5427,7 +5416,7 @@ is_valid_constexpr_fn (tree fun, bool complain)
tree parm = FUNCTION_FIRST_USER_PARM (fun); tree parm = FUNCTION_FIRST_USER_PARM (fun);
bool ret = true; bool ret = true;
for (; parm != NULL; parm = TREE_CHAIN (parm)) 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; ret = false;
if (complain) if (complain)
...@@ -5438,7 +5427,7 @@ is_valid_constexpr_fn (tree fun, bool complain) ...@@ -5438,7 +5427,7 @@ is_valid_constexpr_fn (tree fun, bool complain)
if (!DECL_CONSTRUCTOR_P (fun)) if (!DECL_CONSTRUCTOR_P (fun))
{ {
tree rettype = TREE_TYPE (TREE_TYPE (fun)); tree rettype = TREE_TYPE (TREE_TYPE (fun));
if (!valid_type_in_constexpr_fundecl_p (rettype)) if (!literal_type_p (rettype))
{ {
ret = false; ret = false;
if (complain) if (complain)
......
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> 2011-04-28 Tobias Burnus <burnus@net-b.de>
PR fortran/48112 PR fortran/48112
......
// 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");
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment