https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104733
Bug ID: 104733 Summary: [12 Regression] Likely rejects valid since r12-6022-gbb2a7f80a98de3fe Product: gcc Version: 12.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: marxin at gcc dot gnu.org CC: ppalka at gcc dot gnu.org Target Milestone: --- It's reduced from pythran: https://github.com/serge-sans-paille/pythran/issues/1962 $ cat pythran.ii template <typename _Tp> _Tp __declval(long); template <typename _Tp> auto declval() -> decltype(__declval<_Tp>(0)); template <typename _Tp> _Tp forward; template <class A, class B> auto mul(A a, B) -> decltype(a * 0); namespace types { struct str {}; } // namespace types void operator*(types::str, long); namespace anonymous { template <class T> types::str str(T); } struct str { template <typename... Types> auto operator()(Types...) -> decltype(anonymous::str(forward<Types>...)); }; typedef decltype(mul(declval<decltype(str()(0))>(), 0)) __type10; $ g++ pythran.ii pythran.ii:16:21: error: no matching function for call to ‘mul(types::str, int)’ 16 | typedef decltype(mul(declval<decltype(str()(0))>(), 0)) __type10; | ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pythran.ii:4:34: note: candidate: ‘template<class A, class B> decltype ((a * 0)) mul(A, B)’ 4 | template <class A, class B> auto mul(A a, B) -> decltype(a * 0); | ^~~ pythran.ii:4:34: note: template argument deduction/substitution failed: pythran.ii: In substitution of ‘template<class A, class B> decltype ((a * 0)) mul(A, B) [with A = types::str; B = int]’: pythran.ii:16:21: required from here pythran.ii:4:60: error: no match for ‘operator*’ (operand types are ‘types::str’ and ‘int’) 4 | template <class A, class B> auto mul(A a, B) -> decltype(a * 0); | ~~^~~ pythran.ii:16:21: error: no matching function for call to ‘mul(types::str, int)’ 16 | typedef decltype(mul(declval<decltype(str()(0))>(), 0)) __type10; | ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pythran.ii:4:34: note: candidate: ‘template<class A, class B> decltype ((a * 0)) mul(A, B)’ 4 | template <class A, class B> auto mul(A a, B) -> decltype(a * 0); | ^~~ pythran.ii:4:34: note: template argument deduction/substitution failed: pythran.ii: In substitution of ‘template<class A, class B> decltype ((a * 0)) mul(A, B) [with A = types::str; B = int]’: pythran.ii:16:21: required from here pythran.ii:4:60: error: no match for ‘operator*’ (operand types are ‘types::str’ and ‘int’) 4 | template <class A, class B> auto mul(A a, B) -> decltype(a * 0); | ~~^~~