aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaExpr.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2011-08-29 23:55:37 +0000
committerJohn McCall <rjmccall@apple.com>2011-08-29 23:55:37 +0000
commit709bca84cfdd9ca41518e4ef3797abdf172b9947 (patch)
treeeb7a9cbcc71812010883f5388140f11435468e6c /lib/Sema/SemaExpr.cpp
parent1335cf086f85a6ec6165a91e60828d8d5ea08cec (diff)
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
Diffstat (limited to 'lib/Sema/SemaExpr.cpp')
-rw-r--r--lib/Sema/SemaExpr.cpp16
1 files 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(