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