llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: None (Sirraide) <details> <summary>Changes</summary> We were crashing on trying to print the layout of an uninstantiated template, which obviously doesn’t make sense. This fixes #<!-- -->83684. --- Full diff: https://github.com/llvm/llvm-project/pull/83688.diff 3 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+4) - (modified) clang/lib/AST/Decl.cpp (+1-1) - (modified) clang/test/Layout/dump-complete.cpp (+28-1) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index f44fef28b9f17f..69cf0cb643e6aa 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -308,6 +308,10 @@ Miscellaneous Bug Fixes Miscellaneous Clang Crashes Fixed ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Do not attempt to dump the layout of dependent types when ``-fdump-record-layouts-complete`` + is passed. + Fixes (`#83684 <https://github.com/llvm/llvm-project/issues/83684>`_). + OpenACC Specific Changes ------------------------ diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 5d6bb72a208a1a..d069cd65732310 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -5042,7 +5042,7 @@ void RecordDecl::completeDefinition() { // Layouts are dumped when computed, so if we are dumping for all complete // types, we need to force usage to get types that wouldn't be used elsewhere. - if (Ctx.getLangOpts().DumpRecordLayoutsComplete) + if (Ctx.getLangOpts().DumpRecordLayoutsComplete && !isDependentType()) (void)Ctx.getASTRecordLayout(this); } diff --git a/clang/test/Layout/dump-complete.cpp b/clang/test/Layout/dump-complete.cpp index 9ccbf477c7052e..0a91d3329e6921 100644 --- a/clang/test/Layout/dump-complete.cpp +++ b/clang/test/Layout/dump-complete.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm-only -fdump-record-layouts-complete %s | FileCheck %s +// RUN: %clang_cc1 -fsyntax-only -fdump-record-layouts-complete %s | FileCheck %s struct a { int x; @@ -12,7 +12,34 @@ class c {}; class d; +template <typename> +struct s { + int x; +}; + +template <typename T> +struct ts { + T x; +}; + +void f() { + ts<int> a; + ts<double> b; +} + +namespace gh83684 { +template <class Pointer> +struct AllocationResult { + Pointer ptr = nullptr; + int count = 0; +}; +} + // CHECK: 0 | struct a // CHECK: 0 | struct b // CHECK: 0 | class c +// CHECK: 0 | struct ts<int> +// CHECK: 0 | struct ts<double> // CHECK-NOT: 0 | class d +// CHECK-NOT: 0 | struct s +// CHECK-NOT: 0 | struct AllocationResult `````````` </details> https://github.com/llvm/llvm-project/pull/83688 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits