1d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o %t.ll 2d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: FileCheck %s -check-prefix=FUNS < %t.ll 3d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: FileCheck %s -check-prefix=VARS < %t.ll 4d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o %t.ll 5d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: FileCheck %s -check-prefix=FUNS-HIDDEN < %t.ll 6d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// RUN: FileCheck %s -check-prefix=VARS-HIDDEN < %t.ll 7d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 8d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define HIDDEN __attribute__((visibility("hidden"))) 9d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define PROTECTED __attribute__((visibility("protected"))) 10d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define DEFAULT __attribute__((visibility("default"))) 11d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define TYPE_HIDDEN __attribute__((type_visibility("hidden"))) 12d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define TYPE_PROTECTED __attribute__((type_visibility("protected"))) 13d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#define TYPE_DEFAULT __attribute__((type_visibility("default"))) 14d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 15d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// type_visibility is rdar://11880378 16d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 17d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#if !__has_attribute(type_visibility) 18d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#error No type_visibility attribute! 19d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall#endif 20d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 21d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// The template tests come first because IR-gen reorders RTTI wierdly. 22d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp0 { 23d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct A; 24d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template <class T> struct TYPE_DEFAULT B { 25d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall virtual void foo() {} 26d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 27d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 28d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template struct B<A>; 29d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS: define weak_odr void @_ZN5temp01BINS_1AEE3fooEv( 30d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTVN5temp01BINS_1AEEE = weak_odr unnamed_addr constant 31d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTSN5temp01BINS_1AEEE = weak_odr constant 32d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTIN5temp01BINS_1AEEE = weak_odr unnamed_addr constant 33d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp01BINS_1AEE3fooEv( 34d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTVN5temp01BINS_1AEEE = weak_odr hidden unnamed_addr constant 35d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTSN5temp01BINS_1AEEE = weak_odr hidden constant 36d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTIN5temp01BINS_1AEEE = weak_odr hidden unnamed_addr constant 37d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 38d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 39d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp1 { 40d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct TYPE_DEFAULT A; 41d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template <class T> struct TYPE_DEFAULT B { 42d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall virtual void foo() {} 43d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 44d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 45d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template struct B<A>; 46d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS: define weak_odr void @_ZN5temp11BINS_1AEE3fooEv( 47d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTVN5temp11BINS_1AEEE = weak_odr unnamed_addr constant 48d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTSN5temp11BINS_1AEEE = weak_odr constant 49d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTIN5temp11BINS_1AEEE = weak_odr unnamed_addr constant 50d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp11BINS_1AEE3fooEv( 51d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTVN5temp11BINS_1AEEE = weak_odr unnamed_addr constant 52d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTSN5temp11BINS_1AEEE = weak_odr constant 53d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTIN5temp11BINS_1AEEE = weak_odr unnamed_addr constant 54d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 55d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 56d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp2 { 57d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct TYPE_DEFAULT A; 58d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template <class T> struct B { 59d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall virtual void foo() {} 60d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 61d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 62d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template struct B<A>; 63d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS: define weak_odr void @_ZN5temp21BINS_1AEE3fooEv( 64d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTVN5temp21BINS_1AEEE = weak_odr unnamed_addr constant 65d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTSN5temp21BINS_1AEEE = weak_odr constant 66d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTIN5temp21BINS_1AEEE = weak_odr unnamed_addr constant 67d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp21BINS_1AEE3fooEv( 68d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTVN5temp21BINS_1AEEE = weak_odr hidden unnamed_addr constant 69d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTSN5temp21BINS_1AEEE = weak_odr hidden constant 70d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTIN5temp21BINS_1AEEE = weak_odr hidden unnamed_addr constant 71d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 72d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 73d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp3 { 74d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct TYPE_HIDDEN A; 75d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template <class T> struct TYPE_DEFAULT B { 76d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall virtual void foo() {} 77d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 78d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 79d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template struct B<A>; 80d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS: define weak_odr hidden void @_ZN5temp31BINS_1AEE3fooEv( 81d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTVN5temp31BINS_1AEEE = weak_odr hidden unnamed_addr constant 82d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTSN5temp31BINS_1AEEE = weak_odr hidden constant 83d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTIN5temp31BINS_1AEEE = weak_odr hidden unnamed_addr constant 84d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp31BINS_1AEE3fooEv( 85d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTVN5temp31BINS_1AEEE = weak_odr hidden unnamed_addr constant 86d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTSN5temp31BINS_1AEEE = weak_odr hidden constant 87d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTIN5temp31BINS_1AEEE = weak_odr hidden unnamed_addr constant 88d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 89d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 90d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace temp4 { 91d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct TYPE_DEFAULT A; 92d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template <class T> struct TYPE_HIDDEN B { 93d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall virtual void foo() {} 94d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 95d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 96d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template struct B<A>; 97d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS: define weak_odr void @_ZN5temp41BINS_1AEE3fooEv( 98d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTVN5temp41BINS_1AEEE = weak_odr hidden unnamed_addr constant 99d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTSN5temp41BINS_1AEEE = weak_odr hidden constant 100d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTIN5temp41BINS_1AEEE = weak_odr hidden unnamed_addr constant 101d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS-HIDDEN: define weak_odr hidden void @_ZN5temp41BINS_1AEE3fooEv( 102d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTVN5temp41BINS_1AEEE = weak_odr hidden unnamed_addr constant 103d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTSN5temp41BINS_1AEEE = weak_odr hidden constant 104d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTIN5temp41BINS_1AEEE = weak_odr hidden unnamed_addr constant 105d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 106d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 107d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace type0 { 108d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct TYPE_DEFAULT A { 109d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall virtual void foo(); 110d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 111d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 112d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall void A::foo() {} 113d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS: define void @_ZN5type01A3fooEv( 114d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTVN5type01AE = unnamed_addr constant 115d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTSN5type01AE = constant 116d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTIN5type01AE = unnamed_addr constant 117d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS-HIDDEN: define hidden void @_ZN5type01A3fooEv( 118d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTVN5type01AE = unnamed_addr constant 119d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTSN5type01AE = constant 120d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTIN5type01AE = unnamed_addr constant 121d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 122d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 123d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace type1 { 124d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct HIDDEN TYPE_DEFAULT A { 125d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall virtual void foo(); 126d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 127d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 128d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall void A::foo() {} 129d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS: define hidden void @_ZN5type11A3fooEv( 130d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTVN5type11AE = unnamed_addr constant 131d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTSN5type11AE = constant 132d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTIN5type11AE = unnamed_addr constant 133d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS-HIDDEN: define hidden void @_ZN5type11A3fooEv( 134d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTVN5type11AE = unnamed_addr constant 135d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTSN5type11AE = constant 136d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTIN5type11AE = unnamed_addr constant 137d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 138d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 139d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace type2 { 140d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct TYPE_HIDDEN A { 141d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall virtual void foo(); 142d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 143d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 144d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall void A::foo() {} 145d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS: define void @_ZN5type21A3fooEv( 146d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTVN5type21AE = hidden unnamed_addr constant 147d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTSN5type21AE = hidden constant 148d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTIN5type21AE = hidden unnamed_addr constant 149d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS-HIDDEN: define hidden void @_ZN5type21A3fooEv( 150d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTVN5type21AE = hidden unnamed_addr constant 151d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTSN5type21AE = hidden constant 152d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTIN5type21AE = hidden unnamed_addr constant 153d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 154d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 155d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace type3 { 156d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct DEFAULT TYPE_HIDDEN A { 157d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall virtual void foo(); 158d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 159d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 160d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall void A::foo() {} 161d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS: define void @_ZN5type31A3fooEv( 162d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTVN5type31AE = hidden unnamed_addr constant 163d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTSN5type31AE = hidden constant 164d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS: @_ZTIN5type31AE = hidden unnamed_addr constant 165d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // FUNS-HIDDEN: define void @_ZN5type31A3fooEv( 166d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTVN5type31AE = hidden unnamed_addr constant 167d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTSN5type31AE = hidden constant 168d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // VARS-HIDDEN: @_ZTIN5type31AE = hidden unnamed_addr constant 169d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 170d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 171