aboutsummaryrefslogtreecommitdiff
path: root/test/SemaCXX/linkage.cpp
blob: ba56318fbd68caaa691aceeebd5eacd321330e2f (plain) (blame)
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
// This is an IR generation test because the calculation of visibility
// during IR gen will cause linkage to be implicitly recomputed and
// compared against the earlier cached value.  If we had a way of
// testing linkage directly in Sema, that would be better.

// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s

// PR8926
namespace test0 {
  typedef struct {
    void *foo() { return 0; }
  } A;

  // CHECK: define linkonce_odr i8* @_ZN5test01A3fooEv(

  void test(A *a) {
    a->foo();
  }
}

namespace test1 {
  typedef struct {
    template <unsigned n> void *foo() { return 0; }

    void foo() {
      foo<0>();
    }
  } A;

  // CHECK: define linkonce_odr void @_ZN5test11A3fooEv(
  // another at the end

  void test(A *a) {
    a->foo();
  }
}

namespace test2 {
  typedef struct {
    template <unsigned n> struct B {
      void *foo() { return 0; }
    };

    void foo(B<0> *b) {
      b->foo();
    }
  } A;

  // CHECK: define linkonce_odr void @_ZN5test21A3fooEPNS0_1BILj0EEE(

  void test(A *a) {
    a->foo(0);
  }
}

namespace test3 {
  namespace { struct A {}; }

  // CHECK: define internal void @_ZN5test34testENS_12_GLOBAL__N_11AE(
  void test(A a) {}
  void force() { test(A()); }

  // CHECK: define void @test3(
  extern "C" void test3(A a) {}
}

// CHECK: define linkonce_odr i8* @_ZN5test21A1BILj0EE3fooEv(
// CHECK: define linkonce_odr i8* @_ZN5test11A3fooILj0EEEPvv(