aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2013-08-22 16:30:08 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2013-08-22 16:30:08 +0000
commit42306d73c877d8f52eb80c0a724d27a40f25e2fb (patch)
tree78021d573b580d4f6d3cd6707a84991ccb6fd12a
parent7bf4274ea7e77984c576c691aa5c855086280930 (diff)
downloadgcc-42306d73c877d8f52eb80c0a724d27a40f25e2fb.zip
gcc-42306d73c877d8f52eb80c0a724d27a40f25e2fb.tar.gz
gcc-42306d73c877d8f52eb80c0a724d27a40f25e2fb.tar.bz2
re PR c++/56380 (Const/reference mutable members are not always rejected in class templates)
/cp 2013-08-22 Paolo Carlini <paolo.carlini@oracle.com> PR c++/56380 * class.c (check_field_decls): Check for const mutable and const reference data members. /testsuite 2013-08-22 Paolo Carlini <paolo.carlini@oracle.com> PR c++/56380 * g++.dg/template/error54.C: New. From-SVN: r201925
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/class.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/error54.C10
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4624e73..92884a0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-22 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/56380
+ * class.c (check_field_decls): Check for const mutable and const
+ reference data members.
+
2013-08-22 Gabriel Dos Reis <gdr@integrable-solutions.net>
* error.c (init_error): Remove calls to pp_construct and
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 2f08d5f..596b13d 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -3500,6 +3500,22 @@ check_field_decls (tree t, tree *access_decls,
if (DECL_MUTABLE_P (x) || TYPE_HAS_MUTABLE_P (type))
CLASSTYPE_HAS_MUTABLE (t) = 1;
+ if (DECL_MUTABLE_P (x))
+ {
+ if (CP_TYPE_CONST_P (type))
+ {
+ error ("member %q+D cannot be declared both %<const%> "
+ "and %<mutable%>", x);
+ continue;
+ }
+ if (TREE_CODE (type) == REFERENCE_TYPE)
+ {
+ error ("member %q+D cannot be declared as a %<mutable%> "
+ "reference", x);
+ continue;
+ }
+ }
+
if (! layout_pod_type_p (type))
/* DR 148 now allows pointers to members (which are POD themselves),
to be allowed in POD structs. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c878625..65d3e23 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-08-22 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/56380
+ * g++.dg/template/error54.C: New.
+
2013-08-22 Janus Weil <janus@gcc.gnu.org>
PR fortran/58185
diff --git a/gcc/testsuite/g++.dg/template/error54.C b/gcc/testsuite/g++.dg/template/error54.C
new file mode 100644
index 0000000..2933bb5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/error54.C
@@ -0,0 +1,10 @@
+// PR c++/56380
+
+template <typename T>
+struct X {
+ X();
+ mutable T x; // { dg-error "cannot be declared" }
+};
+
+X<const int> a; // { dg-message "required from here" }
+X<int&> b; // { dg-message "required from here" }