[cfe-commits] r138784 - /cfe/trunk/lib/Sema/SemaExpr.cpp
John McCall
rjmccall at apple.com
Mon Aug 29 16:55:38 PDT 2011
Author: rjmccall
Date: Mon Aug 29 18:55:37 2011
New Revision: 138784
URL: http://llvm.org/viewvc/llvm-project?rev=138784&view=rev
Log:
Update the comment on the default-argument conversion fix; thanks to
Johannes Schaub for talking me around to sense.
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=138784&r1=138783&r2=138784&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Aug 29 18:55:37 2011
@@ -444,12 +444,16 @@
E = ImpCastExprToType(E, Context.DoubleTy, CK_FloatingCast).take();
// C++ performs lvalue-to-rvalue conversion as a default argument
- // promotion. If we still have a gl-value after usual unary
- // conversion, we must have an l-value of class type, so we need to
- // initialize a temporary. For compatibility reasons, however, we
- // don't want to do this in unevaluated contexts; otherwise we
- // reject metaprograms which work by passing uncopyable l-values to
- // variadic functions.
+ // promotion, even on class types, but note:
+ // C++11 [conv.lval]p2:
+ // When an lvalue-to-rvalue conversion occurs in an unevaluated
+ // operand or a subexpression thereof the value contained in the
+ // referenced object is not accessed. Otherwise, if the glvalue
+ // has a class type, the conversion copy-initializes a temporary
+ // of type T from the glvalue and the result of the conversion
+ // is a prvalue for the temporary.
+ // FIXME: add some way to gate this entire thing for correctness in
+ // potentially potentially evaluated contexts.
if (getLangOptions().CPlusPlus && E->isGLValue() &&
ExprEvalContexts.back().Context != Unevaluated) {
ExprResult Temp = PerformCopyInitialization(
More information about the cfe-commits
mailing list