diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-11-15 02:29:26 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-11-15 02:29:26 +0000 |
commit | 83d4834597a779ccafbce6cd91257f4c712adf5f (patch) | |
tree | 2a39c0d7127d072f9c84903876b941c59a3896f5 /clang | |
parent | 09e59155ef772afe59a47aa2a309d54003af814c (diff) | |
download | bcm5719-llvm-83d4834597a779ccafbce6cd91257f4c712adf5f.tar.gz bcm5719-llvm-83d4834597a779ccafbce6cd91257f4c712adf5f.zip |
Don't reject dependent range-based for loops in constexpr functions. The loop
variable isn't really uninitialized, it's just not initialized yet.
llvm-svn: 194767
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaCXX/constant-expression-cxx1y.cpp | 13 |
2 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 660641eec6c..1eec2318e2b 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/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<CXXConstructorDecl>(Dcl))) return false; - if (!VD->hasInit()) { + if (!VD->hasInit() && !VD->isCXXForRangeDecl()) { SemaRef.Diag(VD->getLocation(), diag::err_constexpr_local_var_no_init) << isa<CXXConstructorDecl>(Dcl); diff --git a/clang/test/SemaCXX/constant-expression-cxx1y.cpp b/clang/test/SemaCXX/constant-expression-cxx1y.cpp index 136f7b198a8..521526ddba4 100644 --- a/clang/test/SemaCXX/constant-expression-cxx1y.cpp +++ b/clang/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<typename T, unsigned int N> + 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, ""); +} |