From 43e67707f9ab14deafc57006aad69a263c700450 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Thu, 2 Mar 2023 10:23:48 +0100 Subject: [PATCH] Revert "[clang][Interp] Implement C++ Range-for loops" This reverts commit bce8b3c1830434c10b8a30380db522d7c6a8658d. This commit breaks memory-sanitizer builds: https://lab.llvm.org/buildbot/#/builders/5/builds/31899 --- clang/lib/AST/Interp/ByteCodeStmtGen.cpp | 52 ---------------------------- clang/lib/AST/Interp/ByteCodeStmtGen.h | 1 - clang/test/AST/Interp/loops.cpp | 58 +++----------------------------- 3 files changed, 4 insertions(+), 107 deletions(-) diff --git a/clang/lib/AST/Interp/ByteCodeStmtGen.cpp b/clang/lib/AST/Interp/ByteCodeStmtGen.cpp index 80a81c6..ff2727c 100644 --- a/clang/lib/AST/Interp/ByteCodeStmtGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeStmtGen.cpp @@ -172,8 +172,6 @@ bool ByteCodeStmtGen::visitStmt(const Stmt *S) { return visitDoStmt(cast(S)); case Stmt::ForStmtClass: return visitForStmt(cast(S)); - case Stmt::CXXForRangeStmtClass: - return visitCXXForRangeStmt(cast(S)); case Stmt::BreakStmtClass: return visitBreakStmt(cast(S)); case Stmt::ContinueStmtClass: @@ -372,56 +370,6 @@ bool ByteCodeStmtGen::visitForStmt(const ForStmt *S) { } template -bool ByteCodeStmtGen::visitCXXForRangeStmt(const CXXForRangeStmt *S) { - const Stmt *Init = S->getInit(); - const Expr *Cond = S->getCond(); - const Expr *Inc = S->getInc(); - const Stmt *Body = S->getBody(); - const Stmt *BeginStmt = S->getBeginStmt(); - const Stmt *RangeStmt = S->getRangeStmt(); - const Stmt *EndStmt = S->getEndStmt(); - const VarDecl *LoopVar = S->getLoopVariable(); - - LabelTy EndLabel = this->getLabel(); - LabelTy CondLabel = this->getLabel(); - LabelTy IncLabel = this->getLabel(); - ExprScope ES(this); - LoopScope LS(this, EndLabel, IncLabel); - - // Emit declarations needed in the loop. - if (Init && !this->visitStmt(Init)) - return false; - if (!this->visitStmt(RangeStmt)) - return false; - if (!this->visitStmt(BeginStmt)) - return false; - if (!this->visitStmt(EndStmt)) - return false; - - // Now the condition as well as the loop variable assignment. - this->emitLabel(CondLabel); - if (!this->visitBool(Cond)) - return false; - if (!this->jumpFalse(EndLabel)) - return false; - - if (!this->visitVarDecl(LoopVar)) - return false; - - // Body. - if (!this->visitStmt(Body)) - return false; - this->emitLabel(IncLabel); - if (!this->discard(Inc)) - return false; - if (!this->jump(CondLabel)) - return false; - - this->emitLabel(EndLabel); - return true; -} - -template bool ByteCodeStmtGen::visitBreakStmt(const BreakStmt *S) { if (!BreakLabel) return false; diff --git a/clang/lib/AST/Interp/ByteCodeStmtGen.h b/clang/lib/AST/Interp/ByteCodeStmtGen.h index 6b3644ad..7a30f7b 100644 --- a/clang/lib/AST/Interp/ByteCodeStmtGen.h +++ b/clang/lib/AST/Interp/ByteCodeStmtGen.h @@ -60,7 +60,6 @@ private: bool visitWhileStmt(const WhileStmt *S); bool visitDoStmt(const DoStmt *S); bool visitForStmt(const ForStmt *S); - bool visitCXXForRangeStmt(const CXXForRangeStmt *S); bool visitBreakStmt(const BreakStmt *S); bool visitContinueStmt(const ContinueStmt *S); bool visitSwitchStmt(const SwitchStmt *S); diff --git a/clang/test/AST/Interp/loops.cpp b/clang/test/AST/Interp/loops.cpp index 2e23512..d0386e3 100644 --- a/clang/test/AST/Interp/loops.cpp +++ b/clang/test/AST/Interp/loops.cpp @@ -3,6 +3,10 @@ // RUN: %clang_cc1 -fexperimental-new-constant-interpreter -std=c++20 -verify=expected-cpp20 %s // RUN: %clang_cc1 -std=c++20 -verify=ref %s +// ref-no-diagnostics +// expected-no-diagnostics +// expected-cpp20-no-diagnostics + namespace WhileLoop { constexpr int f() { int i = 0; @@ -270,57 +274,3 @@ namespace ForLoop { #endif }; - -namespace RangeForLoop { - constexpr int localArray() { - int a[] = {1,2,3,4}; - int s = 0; - for(int i : a) { - s += i; - } - return s; - } - static_assert(localArray() == 10, ""); - - constexpr int localArray2() { - int a[] = {1,2,3,4}; - int s = 0; - for(const int &i : a) { - s += i; - } - return s; - } - static_assert(localArray2() == 10, ""); - - constexpr int nested() { - int s = 0; - for (const int i : (int[]){1,2,3,4}) { - int a[] = {i, i}; - for(int m : a) { - s += m; - } - } - return s; - } - static_assert(nested() == 20, ""); - - constexpr int withBreak() { - int s = 0; - for (const int &i: (bool[]){false, true}) { - if (i) - break; - s++; - } - return s; - } - static_assert(withBreak() == 1, ""); - - constexpr void NoBody() { - for (const int &i: (bool[]){false, true}); // expected-warning {{empty body}} \ - // expected-note {{semicolon on a separate line}} \ - // expected-cpp20-warning {{empty body}} \ - // expected-cpp20-note {{semicolon on a separate line}} \ - // ref-warning {{empty body}} \ - // ref-note {{semicolon on a separate line}} - } -} -- 2.7.4