// 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<T>(_ x: T) {}
func variable_use<T>(_ 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<UInt64, String>", '[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 name, type, val in map(derive_name, type_initializer_map):
  generic = (type in ['T', 'U'])
  function = "->" in type
}%                                  
%  if generic:
public class ContextA_${name}<T, U : Proto> {
  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-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")
  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_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
