diff clang/test/SemaTemplate/inject-templated-friend.cpp @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clang/test/SemaTemplate/inject-templated-friend.cpp	Thu Feb 13 15:10:13 2020 +0900
@@ -0,0 +1,50 @@
+// RUN: %clang_cc1 %s -emit-llvm -triple %itanium_abi_triple -o - | FileCheck %s
+// RUN: %clang_cc1 %s -DREDEFINE -verify
+// PR8007: friend function not instantiated.
+
+// CHECK: define linkonce_odr{{.*}}_ZlsR11std_ostreamRK8StreamerI3FooE
+
+struct std_ostream
+{
+  int dummy;
+};
+
+std_ostream cout;
+
+template <typename STRUCT_TYPE>
+struct Streamer
+{
+    friend std_ostream& operator << (std_ostream& o, const Streamer& f) // expected-error{{redefinition of 'operator<<'}}
+        {
+            Streamer s(f);
+            s(o);
+            return o;
+        }
+
+    Streamer(const STRUCT_TYPE& s) : s(s) {}
+
+    const STRUCT_TYPE& s;
+    void operator () (std_ostream&) const;
+};
+
+typedef struct Foo {} Foo;
+
+inline std_ostream& operator << (std_ostream&, const Streamer<Foo>&);
+#ifdef REDEFINE
+std_ostream& operator << (std_ostream& o, const Streamer<Foo>&) // expected-note{{is here}}
+{
+  // Sema should flag this as a redefinition
+  return o;
+}
+#endif
+
+template <>
+void Streamer<Foo>::operator () (std_ostream& o) const // expected-note{{requested here}}
+{
+}
+
+int main(void)
+{
+    Foo foo;
+    cout << foo;
+}