Clang Project

clang_source_code/test/SemaTemplate/instantiate-friend-function.cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2// RUN: %clang_cc1 -S -triple %itanium_abi_triple -std=c++11 -emit-llvm %s -o - | FileCheck %s
3// expected-no-diagnostics
4
5namespace PR10856 {
6  template<typename T> class C;
7
8  template<typename S, typename R = S> C<R> operator - (C<S> m0, C<S> m1);
9  template<typename T> class C {
10    public:
11      template<typename S, typename R> friend C<R> operator - (C<S> m0, C<S> m1);
12  };
13
14  template<typename S, typename R> inline C<R> operator - (C<S> m0, C<S> m1) {
15    C<R> ret;
16    return ret;
17  }
18};
19
20int PR10856_main(int argc, char** argv) {
21  using namespace PR10856;
22  C<int> a;
23  a-a;
24  return 0;
25}
26
27// PR10856::C<int> PR10856::operator-<int, int>(PR10856::C<int>, PR10856::C<int>)
28// CHECK: define {{.*}} @_ZN7PR10856miIiiEENS_1CIT0_EENS1_IT_EES5_
29
30namespace PR10856_Root {
31  template<typename Value, typename Defaulted = void>
32  bool g(Value value);
33
34  template<typename ClassValue> class MyClass {
35  private:
36    template<typename Value, typename Defaulted>
37    friend bool g(Value value);
38  };
39}
40
41namespace PR10856_Root {
42  void f() {
43    MyClass<int> value;
44    g(value);
45  }
46}
47
48// bool PR10856_Root::g<PR10856_Root::MyClass<int>, void>(PR10856_Root::MyClass<int>)
49// CHECK: call {{.*}} @_ZN12PR10856_Root1gINS_7MyClassIiEEvEEbT_
50