summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2013-11-15 02:29:26 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2013-11-15 02:29:26 +0000
commit83d4834597a779ccafbce6cd91257f4c712adf5f (patch)
tree2a39c0d7127d072f9c84903876b941c59a3896f5 /clang
parent09e59155ef772afe59a47aa2a309d54003af814c (diff)
downloadbcm5719-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.cpp2
-rw-r--r--clang/test/SemaCXX/constant-expression-cxx1y.cpp13
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, "");
+}
OpenPOWER on IntegriCloud