// RUN: %target-swift-frontend -primary-file %s -emit-ir -g -o %t.ll // RUN: FileCheck %s < %t.ll // RUN: FileCheck --check-prefix=CHECK-SCOPES %s < %t.ll // RUN: %target-swift-frontend -emit-sil -emit-verbose-sil -primary-file %s -o - | FileCheck %s --check-prefix=SIL-CHECK func markUsed(t: T) {} func classifyPoint2(p: (Double, Double)) { func return_same (input : Double) -> Double { return input; // return_same gets called in both where statements } switch p { case (let x, let y) where // CHECK: call double {{.*}}return_same{{.*}}, !dbg ![[LOC1:.*]] // CHECK: br {{.*}}, label {{.*}}, label {{.*}}, !dbg ![[LOC2:.*]] // CHECK: call{{.*}}markUsed{{.*}}, !dbg ![[LOC3:.*]] // CHECK: ![[LOC1]] = !DILocation(line: [[@LINE+2]], // CHECK: ![[LOC2]] = !DILocation(line: [[@LINE+1]], return_same(x) == return_same(y): // CHECK: ![[LOC3]] = !DILocation(line: [[@LINE+1]], markUsed(x) // SIL-CHECK: dealloc_stack{{.*}}line:[[@LINE-1]]:17:cleanup // Verify that the branch has a location >= the cleanup. // SIL-CHECK-NEXT: br{{.*}}line:[[@LINE-3]]:17:cleanup // CHECK-SCOPES: call {{.*}}markUsed // CHECK-SCOPES: call void @llvm.dbg.value({{.*}}metadata ![[X1:[0-9]+]] // CHECK-SCOPES-SAME: !dbg ![[X1LOC:[0-9]+]] // CHECK-SCOPES: call void @llvm.dbg.value // CHECK-SCOPES: call void @llvm.dbg.value({{.*}}metadata ![[X2:[0-9]+]] // CHECK-SCOPES-SAME: !dbg ![[X2LOC:[0-9]+]] // CHECK-SCOPES: call void @llvm.dbg.value // CHECK-SCOPES: call void @llvm.dbg.value({{.*}}metadata ![[X3:[0-9]+]] // CHECK-SCOPES-SAME: !dbg ![[X3LOC:[0-9]+]] // CHECK-SCOPES: !DILocalVariable(name: "x", case (let x, let y) where x == -y: // Verify that all variables end up in separate appropriate scopes. // CHECK-SCOPES: !DILocalVariable(name: "x", scope: ![[SCOPE1:[0-9]+]], // CHECK-SCOPES-SAME: line: [[@LINE-3]] // CHECK-SCOPES: ![[X1LOC]] = !DILocation(line: [[@LINE-4]], column: 15, // CHECK-SCOPES-SAME: scope: ![[SCOPE1]]) // FIXME: ![[SCOPE1]] = distinct !DILexicalBlock({{.*}}line: [[@LINE-6]] markUsed(x) case (let x, let y) where x >= -10 && x < 10 && y >= -10 && y < 10: // CHECK-SCOPES: !DILocalVariable(name: "x", scope: ![[SCOPE2:[0-9]+]], // CHECK-SCOPES-SAME: line: [[@LINE-2]] // CHECK-SCOPES: ![[X2LOC]] = !DILocation(line: [[@LINE-3]], column: 15, // CHECK-SCOPES-SAME: scope: ![[SCOPE2]]) markUsed(x) case (let x, let y): // CHECK-SCOPES: !DILocalVariable(name: "x", scope: ![[SCOPE3:[0-9]+]], // CHECK-SCOPES-SAME: line: [[@LINE-2]] // CHECK-SCOPES: ![[X3LOC]] = !DILocation(line: [[@LINE-3]], column: 15, // CHECK-SCOPES-SAME: scope: ![[SCOPE3]]) markUsed(x) } // CHECK: !DILocation(line: [[@LINE+1]], }