// 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.

// REQUIRES: rdar47777473
// 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
