[cfe-commits] r91210 - in /cfe/trunk: lib/Sema/SemaExpr.cpp test/SemaCXX/offsetof.cpp test/SemaCXX/vararg-non-pod.cpp
Chris Lattner
clattner at apple.com
Thu Dec 17 12:11:52 PST 2009
On Dec 11, 2009, at 11:25 PM, Douglas Gregor wrote:
> Author: dgregor
> Date: Sat Dec 12 01:25:49 2009
> New Revision: 91210
>
> URL: http://llvm.org/viewvc/llvm-project?rev=91210&view=rev
> Log:
> Suppress warnings and errors about certain uses of non-POD types (in
> __builtin_offsetof, passing through an ellipsis) when we're in an
> unevaluated context. This is the first part of the fix to PR5761,
> which deals with the simple case of an unevaluated context.
Thanks Doug, I feel bad turning this into an error :).
However, it seems bad to duplicate this switch like this into each place that wants to emit a "runtime error". Would it make sense for the individual diagnostic producing cases to make a partial diagnostic and pass it into code that either ignores it, emits it, or buffers it?
-Chris
>
> Modified:
> cfe/trunk/lib/Sema/SemaExpr.cpp
> cfe/trunk/test/SemaCXX/offsetof.cpp
> cfe/trunk/test/SemaCXX/vararg-non-pod.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=91210&r1=91209&r2=91210&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Sat Dec 12 01:25:49 2009
> @@ -259,15 +259,39 @@
> DefaultArgumentPromotion(Expr);
>
> if (Expr->getType()->isObjCInterfaceType()) {
> - Diag(Expr->getLocStart(),
> - diag::err_cannot_pass_objc_interface_to_vararg)
> - << Expr->getType() << CT;
> - return true;
> + switch (ExprEvalContexts.back().Context ) {
> + case Unevaluated:
> + // The argument will never be evaluated, so don't complain.
> + break;
> +
> + case PotentiallyEvaluated:
> + Diag(Expr->getLocStart(),
> + diag::err_cannot_pass_objc_interface_to_vararg)
> + << Expr->getType() << CT;
> + return true;
> +
> + case PotentiallyPotentiallyEvaluated:
> + // FIXME: queue it!
> + break;
> + }
> }
>
> - if (!Expr->getType()->isPODType())
> - Diag(Expr->getLocStart(), diag::warn_cannot_pass_non_pod_arg_to_vararg)
> - << Expr->getType() << CT;
> + if (!Expr->getType()->isPODType()) {
> + switch (ExprEvalContexts.back().Context ) {
> + case Unevaluated:
> + // The argument will never be evaluated, so don't complain.
> + break;
> +
> + case PotentiallyEvaluated:
> + Diag(Expr->getLocStart(), diag::warn_cannot_pass_non_pod_arg_to_vararg)
> + << Expr->getType() << CT;
> + break;
> +
> + case PotentiallyPotentiallyEvaluated:
> + // FIXME: queue it!
> + break;
> + }
> + }
>
> return false;
> }
> @@ -6451,10 +6475,23 @@
> RecordDecl *RD = RC->getDecl();
> if (CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
> if (!CRD->isPOD() && !DidWarnAboutNonPOD) {
> - ExprError(Diag(BuiltinLoc, diag::warn_offsetof_non_pod_type)
> - << SourceRange(CompPtr[0].LocStart, OC.LocEnd)
> - << Res->getType());
> - DidWarnAboutNonPOD = true;
> + switch (ExprEvalContexts.back().Context ) {
> + case Unevaluated:
> + // The argument will never be evaluated, so don't complain.
> + break;
> +
> + case PotentiallyEvaluated:
> + ExprError(Diag(BuiltinLoc, diag::warn_offsetof_non_pod_type)
> + << SourceRange(CompPtr[0].LocStart, OC.LocEnd)
> + << Res->getType());
> + DidWarnAboutNonPOD = true;
> + break;
> +
> + case PotentiallyPotentiallyEvaluated:
> + // FIXME: Queue it!
> + DidWarnAboutNonPOD = true;
> + break;
> + }
> }
> }
>
>
> Modified: cfe/trunk/test/SemaCXX/offsetof.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/offsetof.cpp?rev=91210&r1=91209&r2=91210&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/offsetof.cpp (original)
> +++ cfe/trunk/test/SemaCXX/offsetof.cpp Sat Dec 12 01:25:49 2009
> @@ -16,3 +16,5 @@
> struct Base { int x; };
> struct Derived : Base { int y; };
> int o = __builtin_offsetof(Derived, x); // expected-warning{{offset of on non-POD type}}
> +
> +const int o2 = sizeof(__builtin_offsetof(Derived, x));
>
> Modified: cfe/trunk/test/SemaCXX/vararg-non-pod.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/vararg-non-pod.cpp?rev=91210&r1=91209&r2=91210&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/vararg-non-pod.cpp (original)
> +++ cfe/trunk/test/SemaCXX/vararg-non-pod.cpp Sat Dec 12 01:25:49 2009
> @@ -66,3 +66,12 @@
> E e(10, c); // expected-warning{{cannot pass object of non-POD type 'class C' through variadic constructor; call will abort at runtime}}
> (void)E(10, c); // expected-warning{{cannot pass object of non-POD type 'class C' through variadic constructor; call will abort at runtime}}
> }
> +
> +// PR5761: unevaluated operands and the non-POD warning
> +class Foo {
> + public:
> + Foo() {}
> +};
> +
> +int Helper(...);
> +const int size = sizeof(Helper(Foo()));
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list