| // RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s |
| template <typename T> static void destroy() { |
| template <typename = int> struct HasD { |
| ~HasD() { destroy<Incomplete*>(); } |
| // Ensure we don't get infinite recursion from the check, however. See GH104802 |
| class foo { // expected-note {{definition of 'GH104802::foo' is not complete until the closing '}'}} |
| foo a; // expected-error {{field has incomplete type 'foo'}} |
| class bar { // expected-note {{definition of 'GH104802::bar' is not complete until the closing '}'}} |
| const bar a; // expected-error {{field has incomplete type 'const bar'}} |
| class baz { // expected-note {{definition of 'GH104802::baz' is not complete until the closing '}'}} |
| blech a; // expected-error {{field has incomplete type 'blech' (aka 'GH104802::baz')}} |
| class quux : quux { // expected-error {{base class has incomplete type}} \ |
| expected-note {{definition of 'GH104802::quux' is not complete until the closing '}'}} |