https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105908

            Bug ID: 105908
           Summary: out-of-class definition of templated method with
                    decltype in trailing return type fails to compile
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: falemagn at gmail dot com
  Target Milestone: ---

This code fails to compile with g++12.

    struct test
    {
        template <typename T>
        int templated_func();

        int normal_func();

        template <typename T>
        auto call_with_scope_templated_func() ->
decltype(test::templated_func<T>());

        template <typename T>
        auto call_templated_func() -> decltype(templated_func<T>());

        template <typename T>
        auto call_normal_func() -> decltype(normal_func());
    };

    template <typename T>
    auto test::call_with_scope_templated_func() ->
decltype(test::templated_func<T>())
    {
        return templated_func<T>();
    }

    template <typename T>
    auto test::call_templated_func() -> decltype(templated_func<T>())
    {
        return templated_func<T>();
    }

    template <typename T>
    auto test::call_normal_func() -> decltype(normal_func())
    {
        return normal_func();
    }

gcc complaines like this:

    <source>:25:6: error: no declaration matches 'decltype
(((test*)this)->templated_func<T>()) test::call_templated_func()'
       25 | auto test::call_templated_func() -> decltype(templated_func<T>())
          |      ^~~~
    <source>:12:10: note: candidate is: 'template<class T> decltype
(((test*)this)->templated_func<T>()) test::call_templated_func()'
       12 |     auto call_templated_func() -> decltype(templated_func<T>());
          |          ^~~~~~~~~~~~~~~~~~~
    <source>:1:8: note: 'struct test' defined here
        1 | struct test
          |        ^~~~

However, as you can see, it works if the class name is prepended to the
template_func<T>() call within the decltype expression, and it also works if
the called function is not templated.

G++11 doesn't show any such issue, nor does clang.

An working example on godbolt: https://godbolt.org/z/xK5aoxfxY

Reply via email to