[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