1c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
2c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// rdar://10246395
3c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian
4c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian#define WEAK __attribute__ ((weak))
5c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian
6c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianclass WEAK A {
7c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian  virtual void foo();
8c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian};
9c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian
10c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianclass B : public A {
11c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian  virtual void foo();
12c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian};
13c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianvoid A::foo() { }
14c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianvoid B::foo() { }
15c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian
16c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianclass T {};
17c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianclass T1 {};
18c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian
19c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianclass C : public T1, public B, public T {
20c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian  virtual void foo();
21c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian};
22c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianvoid C::foo() { }
23c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian
24c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianclass V1 : public virtual A {
25c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian  virtual void foo();
26c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian};
27c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian
28c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianclass V2 : public virtual V1 {
29c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian  virtual void foo();
30c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian};
31c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianvoid V1::foo() { }
32c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanianvoid V2::foo() { }
33c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian
34c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTS1A = weak_odr constant
35c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTI1A = weak_odr unnamed_addr constant
36c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTS1B = weak_odr constant
37c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTI1B = weak_odr unnamed_addr constant
38c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTS1C = weak_odr constant
39c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTS2T1 = linkonce_odr constant
40c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTI2T1 = linkonce_odr unnamed_addr constant
41c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTS1T = linkonce_odr constant
42c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTI1T = linkonce_odr unnamed_addr constant
43c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTI1C = weak_odr unnamed_addr constant
44c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTS2V1 = weak_odr constant
45c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTI2V1 = weak_odr unnamed_addr constant
46c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTS2V2 = weak_odr constant
47c93c168eb32a804129a0c7b32ed90b72280abc39Fariborz Jahanian// CHECK: @_ZTI2V2 = weak_odr unnamed_addr constant
48