oontvoo created this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Repro:

- Annotate the unique_ptr class with trivial_abi (eg., 
https://godbolt.org/z/-rprsc)
- ./build/bin/clang++ -stdlib=libc++ -I../libcxx/memory

Crash:

  @     0x559d129463fc  
clang::CXXRecordDecl::defaultedCopyConstructorIsDeleted()
   @     0x559d1288d3e5  
clang::Sema::checkIllFormedTrivialABIStruct()::$_7::operator()()
   @     0x559d12884c34  clang::Sema::checkIllFormedTrivialABIStruct()
   @     0x559d1288412e  clang::Sema::CheckCompletedCXXClass()
   @     0x559d1288d843  clang::Sema::ActOnFinishCXXMemberSpecification()
   @     0x559d12020109  clang::Parser::ParseCXXMemberSpecification()
   @     0x559d1201e80c  clang::Parser::ParseClassSpecifier()
   @     0x559d1204e807  clang::Parser::ParseDeclarationSpecifiers()
   @     0x559d120e9aa9  clang::Parser::ParseSingleDeclarationAfterTemplate()
   @     0x559d120e8f21  
clang::Parser::ParseTemplateDeclarationOrSpecialization()
   @     0x559d120e8886  clang::Parser::ParseDeclarationStartingWithTemplate()
   @     0x559d1204a1d4  clang::Parser::ParseDeclaration()
   @     0x559d12004b1d  clang::Parser::ParseExternalDeclaration()
   @     0x559d12017689  clang::Parser::ParseInnerNamespace()
   @     0x559d12017024  clang::Parser::ParseNamespace()
   @     0x559d1204a29b  clang::Parser::ParseDeclaration()
   @     0x559d12004c74  clang::Parser::ParseExternalDeclaration()


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D83263

Files:
  clang/lib/Sema/SemaDeclCXX.cpp


Index: clang/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- clang/lib/Sema/SemaDeclCXX.cpp
+++ clang/lib/Sema/SemaDeclCXX.cpp
@@ -9719,6 +9719,11 @@
 
   // Ill-formed if the copy and move constructors are deleted.
   auto HasNonDeletedCopyOrMoveConstructor = [&]() {
+    // If we know there exist users-defined move/copy ctors, don't try to infer
+    // the deletion of implicit ones becausee Sema may not have the info yet.
+    if (RD.hasUserDeclaredMoveConstructor() ||
+        RD.hasUserDeclaredCopyConstructor())
+      return true;
     if (RD.needsImplicitCopyConstructor() &&
         !RD.defaultedCopyConstructorIsDeleted())
       return true;


Index: clang/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- clang/lib/Sema/SemaDeclCXX.cpp
+++ clang/lib/Sema/SemaDeclCXX.cpp
@@ -9719,6 +9719,11 @@
 
   // Ill-formed if the copy and move constructors are deleted.
   auto HasNonDeletedCopyOrMoveConstructor = [&]() {
+    // If we know there exist users-defined move/copy ctors, don't try to infer
+    // the deletion of implicit ones becausee Sema may not have the info yet.
+    if (RD.hasUserDeclaredMoveConstructor() ||
+        RD.hasUserDeclaredCopyConstructor())
+      return true;
     if (RD.needsImplicitCopyConstructor() &&
         !RD.defaultedCopyConstructorIsDeleted())
       return true;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to