Add testcase for already fixed PR ipa/92528
authorMartin Jambor <mjambor@suse.cz>
Mon, 18 Nov 2019 15:50:06 +0000 (16:50 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Mon, 18 Nov 2019 15:50:06 +0000 (16:50 +0100)
2019-11-18  Martin Jambor  <mjambor@suse.cz>

PR ipa/92528
* g++.dg/ipa/pr92528.C: New test.

From-SVN: r278415

gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/pr92528.C [new file with mode: 0644]

index 01e8e2b8a69464ce0459d5354ec774518efe0d54..c7e4500c497624dbbab57c5a8d63421ccc416f95 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-18  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/92528
+       * g++.dg/ipa/pr92528.C: New test.
+
 2019-11-18  Richard Sandiford  <richard.sandiford@arm.com>
 
        * lib/target-supports.exp (check_effective_target_vect_check_ptrs):
diff --git a/gcc/testsuite/g++.dg/ipa/pr92528.C b/gcc/testsuite/g++.dg/ipa/pr92528.C
new file mode 100644 (file)
index 0000000..7bc8d5a
--- /dev/null
@@ -0,0 +1,64 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -std=c++11 -w" } */
+
+template <typename _T1, typename _T2> struct A {
+  _T1 first;
+  _T2 second;
+  template <typename _U1, typename _U2>
+  A(_U1 &&p1, _U2 p2) : first(p1), second(p2) {}
+};
+class B {
+public:
+  B(char *);
+};
+struct C {
+  virtual ~C();
+};
+struct D {
+  virtual void registerReporter(B const &, int *) = 0;
+};
+template <typename, typename, typename, typename, typename = int> class F {
+public:
+  void _M_get_insert_unique_pos();
+  template <typename... _Args> A<int, bool> _M_emplace_unique(_Args &&...);
+};
+template <typename _Key, typename _Val, typename _KeyOfValue, typename _Compare,
+          typename _Alloc>
+template <typename... _Args>
+A<int, bool> F<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_emplace_unique(
+    _Args &&...) try {
+  _M_get_insert_unique_pos();
+} catch (...) {
+}
+class G {
+  F<int, int, int, int> _M_t;
+
+public:
+  void insert(A<const B &, int *&> p1) { _M_t._M_emplace_unique(p1); }
+};
+class H {
+public:
+  void registerReporter(B const &p1, int *p2) {
+    A<const B &, int *&> a(p1, p2);
+    m_factories.insert(a);
+  }
+  G m_factories;
+};
+namespace {
+class J : C, D {
+  void registerReporter(B const &p1, int *p2) {
+    m_reporterRegistry.registerReporter(p1, p2);
+  }
+  H m_reporterRegistry;
+};
+J fn1();
+} // namespace
+void fn2() { fn1(); }
+D &fn3();
+class I {
+public:
+  I(B p1) { fn3().registerReporter(p1, new int); }
+};
+namespace {
+I b("");
+}