[cfe-commits] r141768 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/AST/DeclCXX.cpp lib/Sema/SemaType.cpp test/CXX/basic/basic.types/p10.cpp
Richard Smith
richard at metafoo.co.uk
Wed Oct 12 11:07:07 PDT 2011
On Wed, October 12, 2011 17:09, Douglas Gregor wrote:
> On Oct 11, 2011, at 10:08 PM, Richard Smith wrote:
>> Author: rsmith
>> Date: Wed Oct 12 00:08:15 2011
>> New Revision: 141768
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=141768&view=rev
>> Log:
>> constexpr: don't consider class types with mutable members to be literal
>> types.
>>
>> The standard doesn't allow this, but mutable constexpr variables break the
>> semantics so badly that we can't reasonably accept them.
>
> Can you explain a bit? We can't assign to the mutable variables anyway.
Actually... the C++11 IS says this is legal:
struct MM {
mutable int n;
}; // MM is a literal type
template<int n> struct Id { int k = n; };
int f() {
constexpr MM m = { 0 }; // m is const, but...
++m.n; // m.n is mutable
return Id<m.n>().k; // an lvalue-to-rvalue conversion on any subobject
// of a constexpr object is a constant expression
}
There are two natural ways of fixing this: either (a) we say that an
lvalue-to-rvalue conversion on a mutable subobject of a constexpr object is
not a constant expression, or (b) we say that a class with a mutable member is
not a literal type.
The various constexpr papers have made it clear that the constexpr specifier
is supposed to mean (among other things) "this variable is ROM-able", so (b)
seems like the right fix.
> And
have you submitted a core issue on this?
Not yet, I'll send an email to comp.std.c++ later today (unless there's a
better way?).
Thanks,
Richard
More information about the cfe-commits
mailing list