llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Aaron Ballman (AaronBallman) <details> <summary>Changes</summary> d469794d0cdfd2fea50a6ce0c0e33abb242d744c was fixing an issue with triggering vtable instantiations, but it accidentally introduced infinite recursion when the type to be checked is the same as the type used in a base specifier or field declaration. Fixes #<!-- -->104802 --- Full diff: https://github.com/llvm/llvm-project/pull/104829.diff 2 Files Affected: - (modified) clang/lib/Sema/SemaDeclCXX.cpp (+2-2) - (modified) clang/test/SemaCXX/gh102293.cpp (+12-1) ``````````diff diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e05595e565d54a..c1fc61c263791a 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7057,10 +7057,10 @@ void Sema::CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record) { return false; for (const CXXBaseSpecifier &B : RD->bases()) - if (!Check(B.getType(), Check)) + if (B.getType() != T && !Check(B.getType(), Check)) return false; for (const FieldDecl *FD : RD->fields()) - if (!Check(FD->getType(), Check)) + if (FD->getType() != T && !Check(FD->getType(), Check)) return false; return true; }; diff --git a/clang/test/SemaCXX/gh102293.cpp b/clang/test/SemaCXX/gh102293.cpp index 30629fc03bf6a9..ece9dfd21da11c 100644 --- a/clang/test/SemaCXX/gh102293.cpp +++ b/clang/test/SemaCXX/gh102293.cpp @@ -1,5 +1,4 @@ // RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s -// expected-no-diagnostics template <typename T> static void destroy() { T t; @@ -20,3 +19,15 @@ struct S : HasVT { HasD<> v; }; +// Ensure we don't get infinite recursion from the check, however. See GH104802 +namespace GH104802 { +class foo { // expected-note {{definition of 'GH104802::foo' is not complete until the closing '}'}} + foo a; // expected-error {{field has incomplete type 'foo'}} + virtual int c(); +}; + +class bar : bar { // expected-error {{base class has incomplete type}} \ + expected-note {{definition of 'GH104802::bar' is not complete until the closing '}'}} + virtual int c(); +}; +} `````````` </details> https://github.com/llvm/llvm-project/pull/104829 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits