From 709bca84cfdd9ca41518e4ef3797abdf172b9947 Mon Sep 17 00:00:00 2001 From: John McCall Date: Mon, 29 Aug 2011 23:55:37 +0000 Subject: [PATCH] Update the comment on the default-argument conversion fix; thanks to Johannes Schaub for talking me around to sense. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138784 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExpr.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 6327ee71db..a927e13cfd 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -444,12 +444,16 @@ ExprResult Sema::DefaultArgumentPromotion(Expr *E) { 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(