Author: Timm Bäder
Date: 2024-07-02T11:51:07+02:00
New Revision: 62e6255a58eb0e9bb31e366a9e30d5c1eaadd004

URL: 
https://github.com/llvm/llvm-project/commit/62e6255a58eb0e9bb31e366a9e30d5c1eaadd004
DIFF: 
https://github.com/llvm/llvm-project/commit/62e6255a58eb0e9bb31e366a9e30d5c1eaadd004.diff

LOG: [clang][Interp] Add missing fallthrough in loops

Added: 
    

Modified: 
    clang/lib/AST/Interp/Compiler.cpp
    clang/test/AST/Interp/literals.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/Compiler.cpp 
b/clang/lib/AST/Interp/Compiler.cpp
index 77c7e20632881..3d9c72e2b6dee 100644
--- a/clang/lib/AST/Interp/Compiler.cpp
+++ b/clang/lib/AST/Interp/Compiler.cpp
@@ -4139,6 +4139,7 @@ bool Compiler<Emitter>::visitWhileStmt(const WhileStmt 
*S) {
   LabelTy EndLabel = this->getLabel();  // Label after the loop.
   LoopScope<Emitter> LS(this, EndLabel, CondLabel);
 
+  this->fallthrough(CondLabel);
   this->emitLabel(CondLabel);
 
   if (const DeclStmt *CondDecl = S->getConditionVariableDeclStmt())
@@ -4174,12 +4175,14 @@ template <class Emitter> bool 
Compiler<Emitter>::visitDoStmt(const DoStmt *S) {
   LoopScope<Emitter> LS(this, EndLabel, CondLabel);
   LocalScope<Emitter> Scope(this);
 
+  this->fallthrough(StartLabel);
   this->emitLabel(StartLabel);
   {
     DestructorScope<Emitter> DS(Scope);
 
     if (!this->visitLoopBody(Body))
       return false;
+    this->fallthrough(CondLabel);
     this->emitLabel(CondLabel);
     if (!this->visitBool(Cond))
       return false;
@@ -4187,6 +4190,7 @@ template <class Emitter> bool 
Compiler<Emitter>::visitDoStmt(const DoStmt *S) {
   if (!this->jumpTrue(StartLabel))
     return false;
 
+  this->fallthrough(EndLabel);
   this->emitLabel(EndLabel);
   return true;
 }
@@ -4207,6 +4211,7 @@ bool Compiler<Emitter>::visitForStmt(const ForStmt *S) {
 
   if (Init && !this->visitStmt(Init))
     return false;
+  this->fallthrough(CondLabel);
   this->emitLabel(CondLabel);
 
   if (const DeclStmt *CondDecl = S->getConditionVariableDeclStmt())
@@ -4225,6 +4230,7 @@ bool Compiler<Emitter>::visitForStmt(const ForStmt *S) {
 
     if (Body && !this->visitLoopBody(Body))
       return false;
+    this->fallthrough(IncLabel);
     this->emitLabel(IncLabel);
     if (Inc && !this->discard(Inc))
       return false;
@@ -4232,6 +4238,7 @@ bool Compiler<Emitter>::visitForStmt(const ForStmt *S) {
 
   if (!this->jump(CondLabel))
     return false;
+  this->fallthrough(EndLabel);
   this->emitLabel(EndLabel);
   return true;
 }
@@ -4263,6 +4270,7 @@ bool Compiler<Emitter>::visitCXXForRangeStmt(const 
CXXForRangeStmt *S) {
     return false;
 
   // Now the condition as well as the loop variable assignment.
+  this->fallthrough(CondLabel);
   this->emitLabel(CondLabel);
   if (!this->visitBool(Cond))
     return false;
@@ -4279,13 +4287,16 @@ bool Compiler<Emitter>::visitCXXForRangeStmt(const 
CXXForRangeStmt *S) {
 
     if (!this->visitLoopBody(Body))
       return false;
+  this->fallthrough(IncLabel);
     this->emitLabel(IncLabel);
     if (!this->discard(Inc))
       return false;
   }
+
   if (!this->jump(CondLabel))
     return false;
 
+  this->fallthrough(EndLabel);
   this->emitLabel(EndLabel);
   return true;
 }

diff  --git a/clang/test/AST/Interp/literals.cpp 
b/clang/test/AST/Interp/literals.cpp
index a7a602ec355d5..3abaf89e8bd01 100644
--- a/clang/test/AST/Interp/literals.cpp
+++ b/clang/test/AST/Interp/literals.cpp
@@ -1243,3 +1243,16 @@ namespace Extern {
   static_assert(&ExternNonLiteralVarDecl() == &nl, "");
 #endif
 }
+
+#if __cplusplus >= 201402L
+constexpr int StmtExprEval() {
+  if (({
+    while (0);
+    true;
+  })) {
+    return 2;
+  }
+  return 1;
+}
+static_assert(StmtExprEval() == 2, "");
+#endif


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to