re PR c++/87750 (Failed compilation / parsing of template member call after 'using...
authorPaolo Carlini <paolo.carlini@oracle.com>
Sat, 9 Mar 2019 21:49:41 +0000 (21:49 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Sat, 9 Mar 2019 21:49:41 +0000 (21:49 +0000)
2019-03-09  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/87750
* g++.dg/cpp0x/pr87750.C: New.

From-SVN: r269539

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

index 9d857bb4bf17c3b8d7621fb285dc2aa4fe63e5e5..769a5e991919499efbd9f50c1b86b4595eade148 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-09  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/87750
+       * g++.dg/cpp0x/pr87750.C: New.
+
 2019-03-09  John David Anglin  <dave.anglin@bell.net>
 
        * c-c++-common/ident-0b.c: Also skip on 32-bit hppa*-*-hpux*.
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr87750.C b/gcc/testsuite/g++.dg/cpp0x/pr87750.C
new file mode 100644 (file)
index 0000000..6002e41
--- /dev/null
@@ -0,0 +1,40 @@
+// PR c++/87750
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+class Bar
+{
+protected:
+    template <bool B>
+    int process(int) { return 0; }
+};
+
+template<typename T>
+class Derived : Bar<T>
+{
+    using Base = Bar<T>;
+    // Note applying Base::template workaround in (2) and commenting
+    // this out then compiles.
+    using Base::process;
+public:
+    void foo()
+    {
+        // (1) workaround: this->template
+        // This line only fails on gcc 8.x, works in clang/icc/msvc.
+        process<false>();
+    }
+
+    template <bool B>
+    int process()
+    {
+        // (2) workaround: this->template or Base::template
+        // Note clang 5 & 6 don't accept this line either, but clang 7 does.
+        return process<B>(1);
+    }
+};
+
+int main()
+{
+    Derived<int> x;
+    return x.process<false>();
+}