Hi, I noticed that this patch got forgotten and I think it may be useful to solve this next stage 1.
> > cp_apply_type_quals_to_decl drops 'const' if the type has mutable members. > Unfortunately TREE_READONLY on the PARM_DECL isn't helpful in the case of an > invisiref parameter. > > > > But maybe classes with mutable > > > members are never POD and thus always runtime initialized? > > No. > > > C++ frontend has > > > > /* Nonzero means that this type contains a mutable member. */ > > #define CLASSTYPE_HAS_MUTABLE(NODE) (LANG_TYPE_CLASS_CHECK > > (NODE)->has_mutable) > > #define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE)) > > > > but it is not exported to middle-end. > > > > However still this is quite special situation since the object is passed > > using invisible reference, so I wonder if in this sicuation a copy is > > constructed so the callee can possibly overwrite the muttable fields? > > The object bound to the invisible reference is usually a copy, mutable > doesn't make a difference. If I understand situation right, in the following testcase: struct foo { mutable int a; void bar() const; ~foo() { if (a != 42) __builtin_abort (); } }; __attribute__ ((noinline)) void test(const struct foo a) { int b = a.a; a.bar(); if (a.a != b) __builtin_printf ("optimize me away"); } We can not assume that value of a.a was not changed by bar because a is mutable, but otherwise it is safe to optimize out the final check. If that is so, I think we want to let middle-end know that a type has mutable field and use it here, right? Honza > > Jason >