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

            Bug ID: 120555
           Summary: [Possible 15 Regression ] Use of auto func before
                    deduction of auto
           Product: gcc
           Version: 15.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gcc at hazardy dot de
  Target Milestone: ---

The Code (https://gcc.godbolt.org/z/eaYddz3bW):

#include <array>
#include <concepts>

template<typename T>
constexpr auto func() {
    if constexpr ( std::same_as<T, std::array<int, 2>> ) {
        static constexpr std::array<int, 2> ret{23, 42};
        return ret;
    } else {
        static constexpr auto ret = func<std::array<int, 2>>();
        return std::pair{ret.begin(), ret.end()};
    }
}

Runs fine with GCC 14.3 and clang, but with GCC 15.1 not. With -Wtemplate-body
the error message is:
<source>: In function 'constexpr auto func()':
<source>:10:61: error: use of 'constexpr auto func() [with T = std::array<int,
2>]' before deduction of 'auto' [-Wtemplate-body]
   10 |         static constexpr auto ret = func<std::array<int, 2>>();
      |                                     ~~~~~~~~~~~~~~~~~~~~~~~~^~
<source>:10:61: error: use of 'constexpr auto func() [with T = std::array<int,
2>]' before deduction of 'auto' [-Wtemplate-body]

And with -Wno-tempalte-body:
<source>: In instantiation of 'constexpr auto func() [with T = std::array<int,
2>]':
<source>:10:61:   required from here
   10 |         static constexpr auto ret = func<std::array<int, 2>>();
      |                                     ~~~~~~~~~~~~~~~~~~~~~~~~^~
<source>:5:16: error: instantiating erroneous template
    5 | constexpr auto func() {
      |                ^~~~
<source>:10:61: note: first error appeared here
   10 |         static constexpr auto ret = func<std::array<int, 2>>();
      |                                     ~~~~~~~~~~~~~~~~~~~~~~~~^~

Is this invalid code, which just got accepted before, or is it a bug?

Reply via email to