https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94550
Daniel Krügler <daniel.kruegler at googlemail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |daniel.kruegler@googlemail. | |com --- Comment #2 from Daniel Krügler <daniel.kruegler at googlemail dot com> --- (In reply to Andrew Pinski from comment #1) > Do you have a full example? Where the problem occurs since your example > does not compile at all. A full working example would be (reduced by eliminating a huge number of additional pointer indirections and simplifying the function declaration): <<<<<<<<<<<<<<<<<<<<<< struct failed {}; template<typename Pred> failed* (Pred::* * assert_arg(void (*)(Pred), typename Pred::type)); struct predicate { using type = int; }; using type = decltype(assert_arg<predicate>(nullptr, 0)); <<<<<<<<<<<<<<<<<<<<<< But honestly, to me these parentheses look *indeed* redundant to me, so I don't really understand the issue here.