[cfe-commits] r152775 - /cfe/trunk/lib/AST/ExprConstant.cpp
Eli Friedman
eli.friedman at gmail.com
Mon Apr 9 17:22:01 PDT 2012
On Wed, Mar 14, 2012 at 9:53 PM, Richard Smith
<richard-llvm at metafoo.co.uk> wrote:
> Author: rsmith
> Date: Wed Mar 14 23:53:45 2012
> New Revision: 152775
>
> URL: http://llvm.org/viewvc/llvm-project?rev=152775&view=rev
> Log:
> Unrevert r152761 (reverted in r152772) with a fix for the issue which was
> breaking bootstrap. No test yet: it's quite hard to tickle the failure case.
> The specific testcase for this wouldn't be useful for testing anything more
> general than a reintroduction of this precise bug in any case.
>
> Modified:
> cfe/trunk/lib/AST/ExprConstant.cpp
>
> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=152775&r1=152774&r2=152775&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
> +++ cfe/trunk/lib/AST/ExprConstant.cpp Wed Mar 14 23:53:45 2012
> @@ -480,9 +480,19 @@
> return OptionalDiagnostic();
> }
>
> + OptionalDiagnostic Diag(const Expr *E, diag::kind DiagId
> + = diag::note_invalid_subexpr_in_const_expr,
> + unsigned ExtraNotes = 0) {
> + if (EvalStatus.Diag)
> + return Diag(E->getExprLoc(), DiagId, ExtraNotes);
> + HasActiveDiagnostic = false;
> + return OptionalDiagnostic();
> + }
> +
> /// Diagnose that the evaluation does not produce a C++11 core constant
> /// expression.
> - OptionalDiagnostic CCEDiag(SourceLocation Loc, diag::kind DiagId
> + template<typename LocArg>
> + OptionalDiagnostic CCEDiag(LocArg Loc, diag::kind DiagId
> = diag::note_invalid_subexpr_in_const_expr,
> unsigned ExtraNotes = 0) {
> // Don't override a previous diagnostic.
> @@ -556,7 +566,7 @@
> if (Invalid)
> return false;
> if (isOnePastTheEnd()) {
> - Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_past_end_subobject)
> + Info.CCEDiag(E, diag::note_constexpr_past_end_subobject)
> << CSK;
> setInvalid();
> return false;
> @@ -567,11 +577,11 @@
> void SubobjectDesignator::diagnosePointerArithmetic(EvalInfo &Info,
> const Expr *E, uint64_t N) {
> if (MostDerivedPathLength == Entries.size() && MostDerivedArraySize)
> - Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_array_index)
> + Info.CCEDiag(E, diag::note_constexpr_array_index)
> << static_cast<int>(N) << /*array*/ 0
> << static_cast<unsigned>(MostDerivedArraySize);
> else
> - Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_array_index)
> + Info.CCEDiag(E, diag::note_constexpr_array_index)
> << static_cast<int>(N) << /*non-array*/ 1;
> setInvalid();
> }
> @@ -730,7 +740,7 @@
> if (Designator.Invalid)
> return false;
> if (!Base) {
> - Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_null_subobject)
> + Info.CCEDiag(E, diag::note_constexpr_null_subobject)
> << CSK;
> Designator.setInvalid();
> return false;
> @@ -741,27 +751,30 @@
> // Check this LValue refers to an object. If not, set the designator to be
> // invalid and emit a diagnostic.
> bool checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK) {
> + // Outside C++11, do not build a designator referring to a subobject of
> + // any object: we won't use such a designator for anything.
> + if (!Info.getLangOpts().CPlusPlus0x)
> + Designator.setInvalid();
The comment here isn't completely correct: this check affects whether
we accept the expression "FOOBAR"[3] as a constant expression in C.
And I've just run into code C that started using that construct. :(
Any suggestions?
-Eli
More information about the cfe-commits
mailing list