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