https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99262
Bug ID: 99262 Summary: The decltype-specifier that denotes a destructor in a function call is rejected by GCC Product: gcc Version: 10.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: xmh970252187 at gmail dot com Target Milestone: --- ````cpp int main(){ int a = 0; a.~decltype(a)(); } ```` This usage is rejected by GCC<https://godbolt.org/z/dj98nb> while it's accepted by Clang. as per [expr.prim.id#unqual-1], [expr.ref#6.3.2], and [expr.call#5] > A type-name or decltype-specifier prefixed by ~ denotes the destructor of the > type so named; see [expr.prim.id.dtor]. > If E2 is a (possibly overloaded) member function, function overload > resolution ([over.match]) is used to select the function to which E2 refers. > The type of E1.E2 is the type of E2 and E1.E2 refers to the function referred > to by E2. >> Otherwise (when E2 refers to a non-static member function), E1.E2 is a >> prvalue. The expression can be used only as the left-hand operand of a >> member function call ([class.mfct]). >If the postfix-expression names a destructor or pseudo-destructor >([expr.prim.id.dtor]), the type of the function call expression is void; It should be a valid usage.