1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -emit-llvm -triple %itanium_abi_triple -o - %s | FileCheck %s
2f552c20b3dd21855054010e29882e563fdcccff6Douglas Gregor
3f552c20b3dd21855054010e29882e563fdcccff6Douglas Gregor// <rdar://problem/8684363>: clang++ not respecting __attribute__((used)) on destructors
4f552c20b3dd21855054010e29882e563fdcccff6Douglas Gregorstruct X0 {
541f1fd40a962c2abea0324f05dffaad4e770d84dEli Friedman  // CHECK: define linkonce_odr {{.*}} @_ZN2X0C1Ev
6f552c20b3dd21855054010e29882e563fdcccff6Douglas Gregor  __attribute__((used)) X0() {}
741f1fd40a962c2abea0324f05dffaad4e770d84dEli Friedman  // CHECK: define linkonce_odr {{.*}} @_ZN2X0D1Ev
8f552c20b3dd21855054010e29882e563fdcccff6Douglas Gregor  __attribute__((used)) ~X0() {}
9f552c20b3dd21855054010e29882e563fdcccff6Douglas Gregor};
106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// PR19743: not emitting __attribute__((used)) inline methods in nested classes.
126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct X1 {
136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct Nested {
146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    // CHECK: define linkonce_odr {{.*}} @_ZN2X16Nested1fEv
156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    void __attribute__((used)) f() {}
166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
18ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
19ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct X2 {
20ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // We must delay emission of bar() until foo() has had its body parsed,
21ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // otherwise foo() would not be emitted.
22ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  void __attribute__((used)) bar() { foo(); }
23ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  void foo() { }
24ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
25ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: define linkonce_odr {{.*}} @_ZN2X23barEv
26ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: define linkonce_odr {{.*}} @_ZN2X23fooEv
27ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
28