reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fvisibility hidden -ftype-visibility default -emit-llvm -o %t
// RUN: FileCheck %s < %t
// RUN: FileCheck -check-prefix=CHECK-GLOBAL %s < %t

// The two visibility options above are how we translate
// -fvisibility-ms-compat in the driver.

// rdar://13079314

#define HIDDEN __attribute__((visibility("hidden")))
#define PROTECTED __attribute__((visibility("protected")))
#define DEFAULT __attribute__((visibility("default")))

namespace std {
  class type_info;
};

namespace test0 {
  struct A {
    static void foo();
    static void bar();
  };

  void A::foo() { bar(); }
  // CHECK-LABEL: define hidden void @_ZN5test01A3fooEv()
  // CHECK: declare void @_ZN5test01A3barEv()

  const std::type_info &ti = typeid(A);
  // CHECK-GLOBAL: @_ZTSN5test01AE = linkonce_odr constant
  // CHECK-GLOBAL: @_ZTIN5test01AE = linkonce_odr constant
  // CHECK-GLOBAL: @_ZN5test02tiE = hidden constant
}

namespace test1 {
  struct HIDDEN A {
    static void foo();
    static void bar();
  };

  void A::foo() { bar(); }
  // CHECK-LABEL: define hidden void @_ZN5test11A3fooEv()
  // CHECK: declare hidden void @_ZN5test11A3barEv()

  const std::type_info &ti = typeid(A);
  // CHECK-GLOBAL: @_ZTSN5test11AE = linkonce_odr hidden constant
  // CHECK-GLOBAL: @_ZTIN5test11AE = linkonce_odr hidden constant
  // CHECK-GLOBAL: @_ZN5test12tiE = hidden constant
}

namespace test2 {
  struct DEFAULT A {
    static void foo();
    static void bar();
  };

  void A::foo() { bar(); }
  // CHECK-LABEL: define void @_ZN5test21A3fooEv()
  // CHECK: declare void @_ZN5test21A3barEv()

  const std::type_info &ti = typeid(A);
  // CHECK-GLOBAL: @_ZTSN5test21AE = linkonce_odr constant
  // CHECK-GLOBAL: @_ZTIN5test21AE = linkonce_odr constant
  // CHECK-GLOBAL: @_ZN5test22tiE = hidden constant
}

namespace test3 {
  struct A { int x; };
  template <class T> struct B {
    static void foo() { bar(); }
    static void bar();
  };

  template void B<A>::foo();
  // CHECK-LABEL: define weak_odr hidden void @_ZN5test31BINS_1AEE3fooEv()
  // CHECK: declare void @_ZN5test31BINS_1AEE3barEv()

  const std::type_info &ti = typeid(B<A>);
  // CHECK-GLOBAL: @_ZTSN5test31BINS_1AEEE = linkonce_odr constant
  // CHECK-GLOBAL: @_ZTIN5test31BINS_1AEEE = linkonce_odr constant
}

namespace test4 {
  struct A { int x; };
  template <class T> struct DEFAULT B {
    static void foo() { bar(); }
    static void bar();
  };

  template void B<A>::foo();
  // CHECK-LABEL: define weak_odr void @_ZN5test41BINS_1AEE3fooEv()
  // CHECK: declare void @_ZN5test41BINS_1AEE3barEv()

  const std::type_info &ti = typeid(B<A>);
  // CHECK-GLOBAL: @_ZTSN5test41BINS_1AEEE = linkonce_odr constant
  // CHECK-GLOBAL: @_ZTIN5test41BINS_1AEEE = linkonce_odr constant
}

namespace test5 {
  struct A { int x; };
  template <class T> struct HIDDEN B {
    static void foo() { bar(); }
    static void bar();
  };

  template void B<A>::foo();
  // CHECK-LABEL: define weak_odr hidden void @_ZN5test51BINS_1AEE3fooEv()
  // CHECK: declare hidden void @_ZN5test51BINS_1AEE3barEv()

  const std::type_info &ti = typeid(B<A>);
  // CHECK-GLOBAL: @_ZTSN5test51BINS_1AEEE = linkonce_odr hidden constant
  // CHECK-GLOBAL: @_ZTIN5test51BINS_1AEEE = linkonce_odr hidden constant
}