aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Basic/DiagnosticSemaKinds.td4
-rw-r--r--lib/Sema/SemaExpr.cpp39
-rw-r--r--test/SemaCXX/vararg-non-pod.cpp3
3 files changed, 12 insertions, 34 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td
index f8e58267cc..049074d6e5 100644
--- a/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/include/clang/Basic/DiagnosticSemaKinds.td
@@ -4318,10 +4318,6 @@ def err_cannot_pass_objc_interface_to_vararg : Error<
"cannot pass object with interface type %0 by-value through variadic "
"%select{function|block|method}1">;
-def err_cannot_pass_non_pod_to_vararg_ppe : Error<
- "passing object of type %0 to variadic call in a context "
- "which is potentially evaluatable, but not obviously "
- "potentially evaluatable, is not yet implemented">;
def warn_cannot_pass_non_pod_arg_to_vararg : Warning<
"cannot pass object of %select{non-POD|non-trivial}0 type %1 through variadic"
" %select{function|block|method|constructor}2; call will abort at runtime">,
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 33102ccc04..1655c9105f 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -486,34 +486,17 @@ ExprResult Sema::DefaultArgumentPromotion(Expr *E) {
// 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.
- // This requirement has some strange effects for
- // PotentiallyPotentiallyEvaluated contexts; specifically, doing precisely
- // what the standard requires involves mutating the AST once we decide
- // whether an expression is potentially evaluated. Rather than actually try and
- // model this correctly, we just make sure to handle the important cases:
- // for types with a trivial copy constructor/destructor, we build the AST
- // as if it were potentially evaluated, and we give an error in other cases
- // if the context turns out to be potentially evaluatable.
- // FIXME: If anyone actually cares about this case, try to implement
- // it correctly, or at least improve the diagnostic output a bit.
- if (getLangOptions().CPlusPlus && E->isGLValue()) {
- if (ExprEvalContexts.back().Context == PotentiallyPotentiallyEvaluated &&
- E->getType()->isRecordType() &&
- (!E->getType().isTriviallyCopyableType(Context) ||
- E->getType().isDestructedType())) {
- ExprEvalContexts.back()
- .addDiagnostic(E->getExprLoc(),
- PDiag(diag::err_cannot_pass_non_pod_to_vararg_ppe)
- << E->getType());
- } else if (ExprEvalContexts.back().Context != Unevaluated) {
- ExprResult Temp = PerformCopyInitialization(
- InitializedEntity::InitializeTemporary(E->getType()),
- E->getExprLoc(),
- Owned(E));
- if (Temp.isInvalid())
- return ExprError();
- E = Temp.get();
- }
+ // 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(
+ InitializedEntity::InitializeTemporary(E->getType()),
+ E->getExprLoc(),
+ Owned(E));
+ if (Temp.isInvalid())
+ return ExprError();
+ E = Temp.get();
}
return Owned(E);
diff --git a/test/SemaCXX/vararg-non-pod.cpp b/test/SemaCXX/vararg-non-pod.cpp
index aaf6cc1191..42c27fb30e 100644
--- a/test/SemaCXX/vararg-non-pod.cpp
+++ b/test/SemaCXX/vararg-non-pod.cpp
@@ -88,8 +88,7 @@ Base &get_base(...);
int eat_base(...);
void test_typeid(Base &base) {
- (void)typeid(get_base(base)); // expected-warning{{cannot pass object of non-POD type 'Base' through variadic function; call will abort at runtime}} \
- // expected-error {{potentially evaluatable, but not obviously potentially evaluatable}}
+ (void)typeid(get_base(base)); // expected-warning{{cannot pass object of non-POD type 'Base' through variadic function; call will abort at runtime}}
(void)typeid(eat_base(base)); // okay
}