On Wed, Mar 14, 2012 at 9:53 PM, Richard Smith <[email protected]> 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 _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
