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

            Bug ID: 115808
           Summary: Different behavior with optimizations enabled and
                    disabled.
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: linuxnyasha at tutanota dot com
  Target Milestone: ---

```cpp
#include <tuple>
namespace utempl::loopholes {

template <auto I>
struct Getter {
  friend constexpr auto Magic(Getter<I>);
};
template <auto I, auto Value = 0>
struct Injector {
  friend constexpr auto Magic(Getter<I>) {
    return Value;
  };
};

} // namespace utempl::loopholes

namespace utempl {

template <typename... Ts>
struct TypeList {};

} // namespace utempl

struct SomeStruct {
  constexpr SomeStruct(auto&& arg) {
    arg.Method(42);
  };
};

struct Injector {
  template <typename T, auto _ = utempl::loopholes::Injector<0,
utempl::TypeList<T>{}>{}>
  auto Method(T&&) const -> void;
};

template <typename T, auto... Args>
inline constexpr auto Use() {
  std::ignore = T{Args...};
};

template <typename...>
consteval auto Ignore() {};


auto main() -> int {
  Ignore<decltype(Use<SomeStruct, Injector{}>())>();
  static_assert(std::is_same_v<decltype(Magic(utempl::loopholes::Getter<0>{})),
utempl::TypeList<int>>); // Passes with optimizations. Not passes without
};
```
I'm interested in static_assert always passing and code always compiling,
regardless of whether optimizations are enabled or not.
https://godbolt.org/z/WvKGvGEnK

Reply via email to