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

            Bug ID: 94602
           Summary: wrong semantic check to prvalue as decltype operand
           Product: gcc
           Version: 9.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: frankhb1989 at gmail dot com
  Target Milestone: ---

Case:

struct S
{
    ~S() = delete;    
};
S f();
int main()
{
    using X = decltype(f()); // #1
    using Y = decltype(S{}); // #2
}

#2 is wrongly rejected in C++17 mode.

#1 is not ill-formed for the deleted destructor as per C++11
[dcl.type.simple]/5:

> ... in the case where the operand of a decltype-specifier
is a function call and the return type of the function is a class type, a
special rule (5.2.2) ensures that the return type is not required to be
complete (as it would be if the call appeared in a sub-expression or outside of
a
decltype-specifier) ... In particular, it is not necessary to allocate storage
for a temporary object or to enforce the semantic constraints associated with
invoking the type's destructor. ...

This rule is expanded by P0135R1 for cases like #2, which is adopted in C++17.

(See also P0929R2.)

Reply via email to