Hi,
we fail to diagnose such illegal declarations when they occur at
instantiation time.
Patch should be rather straightforward, possibly modulo exact wording;
permerror vs error; something error recovery related (not touching the
CLASSTYPE_HAS_MUTABLE setting seems ok to me).
Booted and tested x86_64-linux.
Thanks,
Paolo.
//////////////////////////
/cp
2013-08-22 Paolo Carlini <paolo.carl...@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.carl...@oracle.com>
PR c++/56380
* g++.dg/template/error54.C: New.
Index: cp/class.c
===================================================================
--- cp/class.c (revision 201917)
+++ cp/class.c (working copy)
@@ -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. */
Index: testsuite/g++.dg/template/error54.C
===================================================================
--- testsuite/g++.dg/template/error54.C (revision 0)
+++ testsuite/g++.dg/template/error54.C (working copy)
@@ -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" }