https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119082
Bug ID: 119082 Summary: GCC Incorrectly Accepts Explicit Destructor Call for Scalar Type in constexpr Context Product: gcc Version: 13.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: qurong at ios dot ac.cn Target Milestone: --- GCC 12.4/13.3/11.4 erroneously compiles code that explicitly calls the destructor of a scalar type (e.g., int) within a constexpr function, while MSVC/Clang correctly reject it. This violates the C++ standard rules. For the following code test.cpp: ``` template <typename T> constexpr bool test_scope() { { T x{}; x.~T(); // Ill-formed if T is a scalar type (e.g., int) } return true; } int main() { constexpr bool a = test_scope<int>(); return 0; } ``` Compile with GCC: g++ -std=c++20 test.cpp Expected Result: Compilation fails with an error about invalid destructor call for scalar types. Actual Result: GCC compiles the code without errors. Environment: Compiler: GCC 12.4/13.3/11.4 Flags: -std=c++20 Standard References: C++20 §7.6.1.4: "The use of a pseudo-destructor-name after a dot . or arrow -> operator represents the destructor for the non-class type denoted by the type-name [...] The result can only be used as the operand for the function call operator ()." C++20 §7.6.1.4/5: "The postfix-expression before the dot . or arrow -> shall have class type." Compiler Explorer link: https://godbolt.org/z/5W1b4zWoj