104 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -fexceptions -fcxx-exceptions -std=c++11 -o - %s | FileCheck %s
 | 
						|
 | 
						|
struct non_trivial {
 | 
						|
  non_trivial();
 | 
						|
  ~non_trivial() noexcept(false);
 | 
						|
};
 | 
						|
non_trivial::non_trivial() {}
 | 
						|
non_trivial::~non_trivial() noexcept(false) {}
 | 
						|
 | 
						|
// We use a virtual base to ensure that the constructor
 | 
						|
// delegation optimization (complete->base) can't be
 | 
						|
// performed.
 | 
						|
struct delegator {
 | 
						|
  non_trivial n; 
 | 
						|
  delegator();
 | 
						|
  delegator(int);
 | 
						|
  delegator(char);
 | 
						|
  delegator(bool);
 | 
						|
};
 | 
						|
 | 
						|
delegator::delegator() {
 | 
						|
  throw 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
delegator::delegator(bool)
 | 
						|
{}
 | 
						|
 | 
						|
// CHECK-LABEL: define {{.*}} @_ZN9delegatorC2Ec
 | 
						|
// CHECK: {{.*}} @_ZN9delegatorC2Eb
 | 
						|
// CHECK: void @__cxa_throw
 | 
						|
// CHECK: void @__clang_call_terminate
 | 
						|
// CHECK: {{.*}} @_ZN9delegatorD2Ev
 | 
						|
 | 
						|
// CHECK-LABEL: define {{.*}} @_ZN9delegatorC1Ec
 | 
						|
// CHECK: {{.*}} @_ZN9delegatorC1Eb
 | 
						|
// CHECK: void @__cxa_throw
 | 
						|
// CHECK: void @__clang_call_terminate
 | 
						|
// CHECK: {{.*}} @_ZN9delegatorD1Ev
 | 
						|
delegator::delegator(char)
 | 
						|
  : delegator(true) {
 | 
						|
  throw 0;
 | 
						|
}
 | 
						|
 | 
						|
// CHECK-LABEL: define {{.*}} @_ZN9delegatorC2Ei
 | 
						|
// CHECK: {{.*}} @_ZN9delegatorC2Ev
 | 
						|
// CHECK-NOT: void @_ZSt9terminatev
 | 
						|
// CHECK: ret
 | 
						|
// CHECK-NOT: void @_ZSt9terminatev
 | 
						|
 | 
						|
// CHECK-LABEL: define {{.*}} @_ZN9delegatorC1Ei
 | 
						|
// CHECK: {{.*}} @_ZN9delegatorC1Ev
 | 
						|
// CHECK-NOT: void @_ZSt9terminatev
 | 
						|
// CHECK: ret
 | 
						|
// CHECK-NOT: void @_ZSt9terminatev
 | 
						|
delegator::delegator(int)
 | 
						|
  : delegator()
 | 
						|
{}
 | 
						|
 | 
						|
namespace PR12890 {
 | 
						|
  class X {
 | 
						|
    int x;
 | 
						|
    X() = default;
 | 
						|
    X(int);
 | 
						|
  };
 | 
						|
  X::X(int) : X() {}
 | 
						|
}
 | 
						|
// CHECK: define {{.*}} @_ZN7PR128901XC1Ei(%"class.PR12890::X"* %this, i32)
 | 
						|
// CHECK: call void @llvm.memset.p0i8.{{i32|i64}}(i8* align 4 {{.*}}, i8 0, {{i32|i64}} 4, i1 false)
 | 
						|
 | 
						|
namespace PR14588 {
 | 
						|
  void other();
 | 
						|
 | 
						|
  class Base {
 | 
						|
  public:
 | 
						|
    Base() { squawk(); }
 | 
						|
    virtual ~Base() {}
 | 
						|
 | 
						|
    virtual void squawk() { other(); }
 | 
						|
  };
 | 
						|
 | 
						|
 | 
						|
  class Foo : public virtual Base {
 | 
						|
  public:
 | 
						|
    Foo();
 | 
						|
    Foo(const void * inVoid);
 | 
						|
    virtual ~Foo() {}
 | 
						|
 | 
						|
    virtual void squawk() { other(); }
 | 
						|
  };
 | 
						|
 | 
						|
  // CHECK-LABEL: define void @_ZN7PR145883FooC1Ev(%"class.PR14588::Foo"*
 | 
						|
  // CHECK: call void @_ZN7PR145883FooC1EPKv(
 | 
						|
  // CHECK: invoke void @_ZN7PR145885otherEv()
 | 
						|
  // CHECK: call void @_ZN7PR145883FooD1Ev
 | 
						|
  // CHECK: resume
 | 
						|
 | 
						|
  Foo::Foo() : Foo(__null) { other(); }
 | 
						|
  Foo::Foo(const void *inVoid) {
 | 
						|
    squawk();
 | 
						|
  }
 | 
						|
 | 
						|
}
 |