]> granicus.if.org Git - clang/commitdiff
Regression test for PR10856
authorSerge Pavlov <sepavloff@gmail.com>
Wed, 26 Jul 2017 14:58:55 +0000 (14:58 +0000)
committerSerge Pavlov <sepavloff@gmail.com>
Wed, 26 Jul 2017 14:58:55 +0000 (14:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@309118 91177308-0d34-0410-b5e6-96231b3b80d8

test/SemaTemplate/instantiate-friend-function.cpp [new file with mode: 0644]

diff --git a/test/SemaTemplate/instantiate-friend-function.cpp b/test/SemaTemplate/instantiate-friend-function.cpp
new file mode 100644 (file)
index 0000000..08602d5
--- /dev/null
@@ -0,0 +1,49 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+// RUN: %clang_cc1 -S -triple %itanium_abi_triple -std=c++11 -emit-llvm %s -o - | FileCheck %s
+// expected-no-diagnostics
+
+namespace PR10856 {
+  template<typename T> class C;
+
+  template<typename S, typename R = S> C<R> operator - (C<S> m0, C<S> m1);
+  template<typename T> class C {
+    public:
+      template<typename S, typename R> friend C<R> operator - (C<S> m0, C<S> m1);
+  };
+
+  template<typename S, typename R> inline C<R> operator - (C<S> m0, C<S> m1) {
+    C<R> ret;
+    return ret;
+  }
+};
+
+int PR10856_main(int argc, char** argv) {
+  using namespace PR10856;
+  C<int> a;
+  a-a;
+  return 0;
+}
+
+// PR10856::C<int> PR10856::operator-<int, int>(PR10856::C<int>, PR10856::C<int>)
+// CHECK: define {{.*}} @_ZN7PR10856miIiiEENS_1CIT0_EENS1_IT_EES5_
+
+namespace PR10856_Root {
+  template<typename Value, typename Defaulted = void>
+  bool g(Value value);
+
+  template<typename ClassValue> class MyClass {
+  private:
+    template<typename Value, typename Defaulted>
+    friend bool g(Value value);
+  };
+}
+
+namespace PR10856_Root {
+  void f() {
+    MyClass<int> value;
+    g(value);
+  }
+}
+
+// bool PR10856_Root::g<PR10856_Root::MyClass<int>, void>(PR10856_Root::MyClass<int>)
+// CHECK: call {{.*}} @_ZN12PR10856_Root1gINS_7MyClassIiEEvEEbT_