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:
parent
09e59155ef
commit
83d4834597
|
@ -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);
|
||||
|
|
|
@ -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, "");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue