diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -1521,6 +1521,12 @@ NextCase = dyn_cast(CurCase->getSubStmt()); } + // Generate a stop point for debug info if the case statement is + // followed by a default statement. A fallthrough case before a + // default case gets its own branch target. + if (CurCase->getSubStmt()->getStmtClass() == Stmt::DefaultStmtClass) + EmitStopPoint(CurCase); + // Normal default recursion for non-cases. EmitStmt(CurCase->getSubStmt()); } diff --git a/clang/test/CodeGen/debug-info-switch-fallthrough.c b/clang/test/CodeGen/debug-info-switch-fallthrough.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/debug-info-switch-fallthrough.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple x86_64-apple-macosx11.0.0 -debug-info-kind=standalone -emit-llvm %s -o - | FileCheck %s +// CHECK: ], !dbg !{{[0-9]+}} +// CHECK-EMPTY: +// CHECK-NEXT: {{.+}} +// CHECK-NEXT: br {{.+}}, !dbg !{{[0-9+]}} +// CHECK-EMPTY: +// CHECK-NEXT: {{.+}} +// CHECK-NEXT: br {{.+}}, !dbg ![[LOC:[0-9]+]] +void test(int num) { + switch (num) { + case 0: + break; + case 10: // CHECK: ![[LOC]] = !DILocation(line: [[@LINE]], column:{{.+}}, scope: {{.+}}) + default: + break; + } +}