// An end-to-end test to ensure local variables have debug info. This // test only verifies that the variables show up in the debug info at // all. There are other tests testing liveness and representation. // RUN: %gyb %s -o %t.swift // RUN: %target-swift-frontend %t.swift -g -emit-ir -o - | %FileCheck %t.swift // RUN: %target-swift-frontend %t.swift -g -c -o %t.o // RUN: %llvm-dwarfdump %t.o \ // RUN: | %FileCheck %t.swift --check-prefix=DWARF // RUN: %llvm-dwarfdump --verify %t.o // RUN: %target-swift-frontend %t.swift -O -g -emit-ir -o - \ // RUN: | %FileCheck %t.swift --check-prefix=OPTZNS // OPTZNS-NOT: alloca{{.*}}.addr public class C { let member : Int init(_ i : Int) { member = i } func isZero() -> Bool { return member == 0 } } public struct S { let i : Int32 = -1 let j : Int32 = 2 } public struct SLarge { var tuple : (Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64) } public enum ENoPayload { case one case two } public enum ESinglePayload : Int { case one = 1 case two = 2 } public enum EMultiPayload { case int(Int) indirect case recursive(EMultiPayload) case string(String) } public protocol Proto { func f() } func nop() {} func use(_ x: T) {} func variable_use(_ x: inout T) {} %{ type_initializer_map = [ #// Basic types. ("UInt64", "64"), ("UInt32", "32"), ("Int64", "64"), ("Int32", "32"), ("Int", "42"), ("UInt", "42"), ("Float", "2.71"), ("Double", "3.14"), #// Sugared types and strings. ("String", '"string"'), ("[UInt64]", "[1, 2, 3]"), ("Dictionary", '[1:"entry"]'), #// Classes, structs, tuples. ("(Int, C)", "(42, C(42))"), ("C", "C(42)"), ("S", "S()"), ("SLarge", "SLarge(tuple: (1,2,3,4,5,6,7,8))"), #// Enums. ("ENoPayload", ".two"), ("ESinglePayload", ".two"), ("EMultiPayload", ".recursive(.string(\"string\"))"), #// Existentials. ("T", "self.t"), ("U", "self.u"), #// Functions. ("(() -> ())", "nop") ] import re def derive_name(type, val): return (re.sub(r'[<> ,\.\?\(\)\[\]-]', '_', type), type, val) for (type, val) in type_initializer_map: (name, type, val) = derive_name(type, val) generic = (type in ['T', 'U']) function = "->" in type }% % if generic: public class ContextA_${name} { let t : T let u : U init(_ t: T, _ u: U) { self.t = t; self.u = u; } % end public func constant_${name}() -> ${type} { let v : ${type} = ${val} // CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]] // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}constant_${name} // DWARF-NOT: DW_TAG_subprogram % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: {{(DW_AT_location)|(DW_AT_const_value)}} // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("v") return v } public func constvar_${name}() { var v : ${type} = ${val} // CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]] // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}constvar_${name} // DWARF-NOT: DW_TAG_subprogram % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: {{(DW_AT_location)|(DW_AT_const_value)}} // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("v") variable_use(&v) } public func let_${name}() { let v : ${type} = constant_${name}() // CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]] // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}let_${name} // DWARF-NOT: DW_TAG_subprogram % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: {{(DW_AT_location)|(DW_AT_const_value)}} // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("v") use(v) } public func case_let_${name}() { switch constant_${name}() { case let v: // CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]] use(v) } // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}let_${name} // DWARF-NOT: DW_TAG_subprogram % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: {{(DW_AT_location)|(DW_AT_const_value)}} // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("v") } public func optional_${name}() -> ${type}? { return constant_${name}(); } public func guard_let_${name}() { let opt : ${type}? = optional_${name}() // CHECK: !DILocalVariable(name: "opt",{{.*}} line: [[@LINE-1]] // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}guard_let_${name} // DWARF-NOT: DW_TAG_subprogram % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_location // DWARF-NOT: DW_TAG // DWARF: DW_AT_name // DWARF-SAME: "{{(opt)|(val)}}" guard let val = opt else { use(opt) fatalError() } // DWARF-NOT: DW_TAG // DWARF: DW_TAG_lexical_block // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_location // DWARF-NOT: DW_TAG // DWARF: DW_AT_name // DWARF-SAME: "{{(opt)|(val)}}" use(val) } public func var_${name}() { var v : ${type} = constant_${name}() // CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]] // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}var_${name} // DWARF-NOT: DW_TAG_subprogram % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_location // DWARF-NOT: DW_TAG // DWARF: DW_AT_name {{.*}}"v" variable_use(&v) } public func arg_${name}(_ v: ${type}) { // CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]] // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}arg_${name} // DWARF-NOT: DW_TAG_subprogram // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_location // DWARF-NOT: DW_TAG // DWARF: DW_AT_name {{.*}}"v" % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end % if not function: use(v) % end } public func arg_inout_${name}(_ v: inout ${type}) { // CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]] // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}arg_inout_${name} // DWARF-NOT: DW_TAG_subprogram // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_location // DWARF-NOT: DW_TAG // DWARF: DW_AT_name {{.*}}"v" % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end variable_use(&v) } public func arg_tuple_${name}(_ v: (${type}, ${type})) { let (_, y) = v // CHECK: !DILocalVariable(name: "y",{{.*}} line: [[@LINE-1]] // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}arg_tuple_${name} // DWARF-NOT: DW_TAG_subprogram // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_location // DWARF-NOT: DW_TAG // DWARF: DW_AT_name {{.*}}"v" % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // FIMXE-DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_location // DWARF-NOT: DW_TAG // DWARF: DW_AT_name {{.*}}"y" use(y) } public func closure_capture_${name}() { let v : ${type} = constant_${name}(); // CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]] use({ () -> ${type} in v }()) // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}closure_capture_${name} // DWARF: DW_TAG_subprogram // DWARF: DW_AT_linkage_name {{.*}}closure_capture_${name} // DWARF-NOT: DW_AT_name {{.*}}closure_capture_${name} // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_location // DWARF-NOT: DW_TAG // DWARF: DW_AT_name {{.*}}"v" % if generic: // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end } public func closure_capture_byref_${name}() { var v : ${type} = constant_${name}(); // CHECK: !DILocalVariable(name: "v",{{.*}} line: [[@LINE-1]] { () -> () in v = ${val} }() use(v) // DWARF: DW_TAG_subprogram // DWARF-LABEL: DW_AT_name {{.*}}closure_capture_byref_${name} // DWARF: DW_TAG_subprogram // DWARF: DW_AT_linkage_name {{.*}}closure_capture_byref_${name} // DWARF-NOT: DW_AT_name {{.*}}closure_capture_byref_${name} // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_location // DWARF-NOT: DW_TAG // DWARF: DW_AT_name {{.*}}"v" % if generic: // DWARF: DW_TAG_formal_parameter // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("self") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial // DWARF-NOT: DW_TAG // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF: DW_AT_artificial // DWARF: DW_TAG_variable // DWARF-NOT: DW_TAG // DWARF: DW_AT_name ("$swift.type.{{T|U}}") // DWARF-NOT: DW_TAG // DWARF: DW_AT_artificial % end } % if generic: } // End of Context_${name}. % end