DR 1453
authorPaolo Carlini <paolo.carlini@oracle.com>
Tue, 2 Sep 2014 15:38:38 +0000 (15:38 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Tue, 2 Sep 2014 15:38:38 +0000 (15:38 +0000)
/cp
2014-09-02  Paolo Carlini  <paolo.carlini@oracle.com>

DR 1453
* class.c (check_field_decls): A class of literal type cannot have
volatile non-static data members and base classes.
(explain_non_literal_class): Update.

/testsuite
2014-09-02  Paolo Carlini  <paolo.carlini@oracle.com>

DR 1453
* g++.dg/cpp0x/constexpr-volatile.C: New.
* g++.dg/ext/is_literal_type2.C: Likewise.

From-SVN: r214823

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-volatile.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/is_literal_type2.C [new file with mode: 0644]

index 7a72097c64676a863858546e2ff17e61cfaf9a45..258fd9bf605288d565ee52113d0307af021e8596 100644 (file)
@@ -1,3 +1,10 @@
+2014-09-02  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       DR 1453
+       * class.c (check_field_decls): A class of literal type cannot have
+       volatile non-static data members and base classes.
+       (explain_non_literal_class): Update.
+
 2014-09-02  Jakub Jelinek  <jakub@redhat.com>
            Balaji V. Iyer  <balaji.v.iyer@intel.com>
            Igor Zamyatin  <igor.zamyatin@intel.com>
index 5c9a9a72dcd862d9620450620fde2c309d2ce740..09f946fcdf7c45eef7c09dffe99ee71ed49c18a3 100644 (file)
@@ -3528,9 +3528,11 @@ check_field_decls (tree t, tree *access_decls,
        CLASSTYPE_NON_AGGREGATE (t) = 1;
 
       /* If at least one non-static data member is non-literal, the whole
-         class becomes non-literal.  Note: if the type is incomplete we
-        will complain later on.  */
-      if (COMPLETE_TYPE_P (type) && !literal_type_p (type))
+         class becomes non-literal.  Per Core/1453, volatile non-static
+        data members and base classes are also not allowed.
+        Note: if the type is incomplete we will complain later on.  */
+      if (COMPLETE_TYPE_P (type)
+         && (!literal_type_p (type) || CP_TYPE_VOLATILE_P (type))) 
         CLASSTYPE_LITERAL_P (t) = false;
 
       /* A standard-layout class is a class that:
@@ -5431,6 +5433,9 @@ explain_non_literal_class (tree t)
              if (CLASS_TYPE_P (ftype))
                explain_non_literal_class (ftype);
            }
+         if (CP_TYPE_VOLATILE_P (ftype))
+           inform (0, "  non-static data member %q+D has "
+                   "volatile type", field);
        }
     }
 }
index 7281fd92da46379a0d2435e1ccfcc5ffe8a6d887..0bffdb06ae4668b65037ebf3fa087d07463eec83 100644 (file)
@@ -1,3 +1,9 @@
+2014-09-02  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       DR 1453
+       * g++.dg/cpp0x/constexpr-volatile.C: New.
+       * g++.dg/ext/is_literal_type2.C: Likewise.
+
 2014-09-02  Jakub Jelinek  <jakub@redhat.com>
            Balaji V. Iyer  <balaji.v.iyer@intel.com>
            Igor Zamyatin  <igor.zamyatin@intel.com>
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-volatile.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-volatile.C
new file mode 100644 (file)
index 0000000..1203b04
--- /dev/null
@@ -0,0 +1,26 @@
+// DR 1453
+// { dg-do compile { target c++11 } }
+
+struct S {
+  constexpr S() : n{} { }
+  volatile int n;
+};
+
+constexpr S s;  // { dg-error "literal" }
+
+struct Z {
+  volatile int m;
+};
+
+struct T {
+  constexpr T() : n{} { }
+  Z n;
+};
+
+constexpr T t;  // { dg-error "literal" }
+
+struct U : Z {
+  constexpr U() : Z{} { }
+};
+
+constexpr U u;  // { dg-error "literal" }
diff --git a/gcc/testsuite/g++.dg/ext/is_literal_type2.C b/gcc/testsuite/g++.dg/ext/is_literal_type2.C
new file mode 100644 (file)
index 0000000..8a0632b
--- /dev/null
@@ -0,0 +1,26 @@
+// DR 1453
+// { dg-do compile { target c++11 } }
+
+struct S {
+  constexpr S() : n{} { }
+  volatile int n;
+};
+
+static_assert(!__is_literal_type(S), "");
+
+struct Z {
+  volatile int m;
+};
+
+struct T {
+  constexpr T() : n{} { }
+  Z n;
+};
+
+static_assert(!__is_literal_type(T), "");
+
+struct U : Z {
+  constexpr U() : Z{} { }
+};
+
+static_assert(!__is_literal_type(U), "");