re PR c++/48771 ([C++0x] is_literal_type incorrect for references to non-literal...
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 28 Apr 2011 09:21:23 +0000 (09:21 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 28 Apr 2011 09:21:23 +0000 (09:21 +0000)
/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

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/is_literal_type1.C [new file with mode: 0644]

index e1afe47ecea6b224e72670393f639937235c0d93..64cb011561a8cdcfa38409919d70af58d5fd3674 100644 (file)
@@ -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
index 16fabb80556f2b2d6b51bcab20bdf0b9348639d5..c6364120fe52ae6ce7b3e7f8cdfc469fa8902cc2 100644 (file)
@@ -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)
index cbad463803d52fdf16ebb02df612d90d92a44e17..904848c1e61ea40e9ce72972221af1fee3ee86fd 100644 (file)
@@ -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
diff --git a/gcc/testsuite/g++.dg/ext/is_literal_type1.C b/gcc/testsuite/g++.dg/ext/is_literal_type1.C
new file mode 100644 (file)
index 0000000..21570d2
--- /dev/null
@@ -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");