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
This commit is contained in:
Richard Smith 2013-11-15 02:29:26 +00:00
parent 09e59155ef
commit 83d4834597
2 changed files with 14 additions and 1 deletions

View File

@ -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);

View File

@ -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, "");
}