From f72bc468e54819393c1805f19cbf353061b4c0ec Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 15 Nov 2013 02:29:26 +0000 Subject: [PATCH] Don't reject dependent range-based for loops in constexpr functions. The loop variable isn't really uninitialized, it's just not initialized yet. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194767 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclCXX.cpp | 2 +- test/SemaCXX/constant-expression-cxx1y.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 660641eec6..1eec2318e2 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -880,7 +880,7 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, diag::err_constexpr_local_var_non_literal_type, isa(Dcl))) return false; - if (!VD->hasInit()) { + if (!VD->hasInit() && !VD->isCXXForRangeDecl()) { SemaRef.Diag(VD->getLocation(), diag::err_constexpr_local_var_no_init) << isa(Dcl); diff --git a/test/SemaCXX/constant-expression-cxx1y.cpp b/test/SemaCXX/constant-expression-cxx1y.cpp index 136f7b198a..521526ddba 100644 --- a/test/SemaCXX/constant-expression-cxx1y.cpp +++ b/test/SemaCXX/constant-expression-cxx1y.cpp @@ -898,3 +898,16 @@ namespace PR17615 { }; constexpr int k = A().r; // expected-error {{constant expression}} expected-note {{in call to}} } + +namespace PR17331 { + template + constexpr T sum(const T (&arr)[N]) { + T result = 0; + for (T i : arr) + result += i; + return result; + } + + constexpr int ARR[] = { 1, 2, 3, 4, 5 }; + static_assert(sum(ARR) == 15, ""); +} -- 2.40.0