17143325db76d6c3dabce82500f8cc7c93a941970John McCall// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
20fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregorstruct X {
30fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  X();
40fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  ~X();
50fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor};
60fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor
70fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregorstruct Y {
80fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  Y();
90fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  ~Y();
100fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor};
110fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor
120fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor// CHECK: define void @_Z1fiPPKc(
130fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregorvoid f(int argc, const char* argv[]) {
140fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  // CHECK: call void @_ZN1XC1Ev
150fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  X x;
160fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  // CHECK: call i8* @llvm.stacksave(
170fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  const char *argv2[argc];
180fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  // CHECK: call void @_ZN1YC1Ev
190fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  Y y;
200fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  for (int i = 0; i != argc; ++i)
210fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor    argv2[i] = argv[i];
220fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor
230fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  // CHECK: call void @_ZN1YD1Ev
240fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  // CHECK: call void @llvm.stackrestore
250fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  // CHECK: call void @_ZN1XD1Ev
260fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor  // CHECK: ret void
270fddb97901dbe36a8253dee29961cba8e0a87cf6Douglas Gregor}
2801f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedman
2901f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedmannamespace PR11744 {
3001f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedman  // Make sure this doesn't crash; there was a use-after-free issue
3101f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedman  // for this testcase.
3201f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedman  template<typename T> int f(int n) {
3301f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedman    T arr[3][n];
3401f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedman    return 3;
3501f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedman  }
3601f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedman  int test = f<int>(0);
3701f276dac946c0845f6eb3449ab253cfdba841a1Eli Friedman}
38