Might be a good candidate for Clang 6.0.1. On 8 March 2018 at 18:00, Richard Smith via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: rsmith > Date: Thu Mar 8 18:00:01 2018 > New Revision: 327099 > > URL: http://llvm.org/viewvc/llvm-project?rev=327099&view=rev > Log: > PR36645: Go looking for an appropriate array bound when > constant-evaluating a > name of an array object. > > Modified: > cfe/trunk/lib/AST/ExprConstant.cpp > cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp > > Modified: cfe/trunk/lib/AST/ExprConstant.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ > ExprConstant.cpp?rev=327099&r1=327098&r2=327099&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/AST/ExprConstant.cpp (original) > +++ cfe/trunk/lib/AST/ExprConstant.cpp Thu Mar 8 18:00:01 2018 > @@ -63,14 +63,22 @@ namespace { > > static QualType getType(APValue::LValueBase B) { > if (!B) return QualType(); > - if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) > + if (const ValueDecl *D = B.dyn_cast<const ValueDecl*>()) { > // FIXME: It's unclear where we're supposed to take the type from, > and > - // this actually matters for arrays of unknown bound. Using the > type of > - // the most recent declaration isn't clearly correct in general. Eg: > + // this actually matters for arrays of unknown bound. Eg: > // > // extern int arr[]; void f() { extern int arr[3]; }; > // constexpr int *p = &arr[1]; // valid? > - return cast<ValueDecl>(D->getMostRecentDecl())->getType(); > + // > + // For now, we take the array bound from the most recent > declaration. > + for (auto *Redecl = cast<ValueDecl>(D->getMostRecentDecl()); > Redecl; > + Redecl = cast_or_null<ValueDecl>(Redecl->getPreviousDecl())) { > + QualType T = Redecl->getType(); > + if (!T->isIncompleteArrayType()) > + return T; > + } > + return D->getType(); > + } > > const Expr *Base = B.get<const Expr*>(); > > > Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/ > SemaCXX/constant-expression-cxx11.cpp?rev=327099&r1= > 327098&r2=327099&view=diff > ============================================================ > ================== > --- cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp (original) > +++ cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Thu Mar 8 > 18:00:01 2018 > @@ -629,6 +629,10 @@ namespace ArrayOfUnknownBound { > > extern const int carr[]; // expected-note {{here}} > constexpr int n = carr[0]; // expected-error {{constant}} expected-note > {{non-constexpr variable}} > + > + constexpr int local_extern[] = {1, 2, 3}; > + void f() { extern const int local_extern[]; } > + static_assert(local_extern[1] == 2, ""); > } > > namespace DependentValues { > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits