// RUN: %clang_cc1  -fcxx-exceptions -fexceptions -emit-llvm -debug-info-kind=limited -triple x86_64-apple-darwin10 %s -o - | FileCheck %s
// The landing pad should have the line number of the closing brace of the function.
// rdar://problem/13888152
// CHECK: ret i32
// CHECK: landingpad {{.*}}
// CHECK-NEXT: !dbg ![[LPAD:[0-9]+]]
// CHECK: ![[LPAD]] = !DILocation(line: 24, scope: !{{.*}})

# 1 "/usr/include/c++/4.2.1/vector" 1 3
typedef long unsigned int __darwin_size_t;
typedef __darwin_size_t size_t;
namespace std {
  template<typename _Tp>
  class allocator
  {
  public:
    template<typename _Tp1>
    struct rebind
    { typedef allocator<_Tp1> other; };
    ~allocator() throw() { }
  };
  template<typename _Tp, typename _Alloc>
  struct _Vector_base
  {
    typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
    struct _Vector_impl
    {
      _Vector_impl(_Tp_alloc_type const& __a)      { }
    };
    typedef _Alloc allocator_type;
    _Vector_base(const allocator_type& __a)
    : _M_impl(__a)
    {  }
    ~_Vector_base()  {  }
    _Vector_impl _M_impl;
  };
  template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
  class vector
    : protected _Vector_base<_Tp, _Alloc>
  {
    typedef _Vector_base<_Tp, _Alloc> _Base;
  public:
    typedef _Tp value_type;
    typedef size_t size_type;
    typedef _Alloc allocator_type;
    vector(const allocator_type& __a = allocator_type())
      : _Base(__a)
    {      }
    size_type
    push_back(const value_type& __x)
    {}
  };
}
# 10 "main.cpp" 2




int main (int argc, char const *argv[], char const *envp[])
{ // 15
  std::vector<long> longs;
  std::vector<short> shorts;
  for (int i=0; i<12; i++)
    {
      longs.push_back(i);
      shorts.push_back(i);
    }
  return 0; // 23
} // 24
