// RUN: %clang_cc1  -fcxx-exceptions -fexceptions -emit-llvm -debug-info-kind=limited -triple x86_64-apple-darwin10 -std=c++98 %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
