adamcz created this revision.
adamcz added a reviewer: hokein.
adamcz requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Undeduced fields in a valid record cause crashes when trying to obtain
the size and/or layout of the record.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D105478

Files:
  clang/lib/Sema/SemaDecl.cpp
  clang/test/SemaCXX/cxx11-crashes.cpp


Index: clang/test/SemaCXX/cxx11-crashes.cpp
===================================================================
--- clang/test/SemaCXX/cxx11-crashes.cpp
+++ clang/test/SemaCXX/cxx11-crashes.cpp
@@ -104,3 +104,20 @@
   bool baz() { return __has_nothrow_constructor(B); }
   bool qux() { return __has_nothrow_copy(B); }
 }
+
+namespace undeduced_field {
+template<class T>
+struct Foo {
+  typedef T type;
+};
+
+struct Bar {
+  Bar();
+  // The missing expression makes A undeduced.
+  static constexpr auto A = ;  // expected-error {{expected expression}}
+  Foo<decltype(A)>::type B;  // The type of B is also undeduced (wrapped in 
Elaborated).
+};
+
+// This used to crash when trying to get the layout of B.
+Bar x;
+}
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -17498,8 +17498,13 @@
         Record->setArgPassingRestrictions(RecordDecl::APK_CanNeverPassInRegs);
     }
 
-    if (Record && FD->getType().isVolatileQualified())
-      Record->setHasVolatileMember(true);
+    if (Record) {
+      if (FD->getType().isVolatileQualified())
+        Record->setHasVolatileMember(true);
+      if (const auto *T = FD->getType()->getUnqualifiedDesugaredType())
+        if (T->isUndeducedType())
+          Record->setInvalidDecl();
+    }
     // Keep track of the number of named members.
     if (FD->getIdentifier())
       ++NumNamedMembers;


Index: clang/test/SemaCXX/cxx11-crashes.cpp
===================================================================
--- clang/test/SemaCXX/cxx11-crashes.cpp
+++ clang/test/SemaCXX/cxx11-crashes.cpp
@@ -104,3 +104,20 @@
   bool baz() { return __has_nothrow_constructor(B); }
   bool qux() { return __has_nothrow_copy(B); }
 }
+
+namespace undeduced_field {
+template<class T>
+struct Foo {
+  typedef T type;
+};
+
+struct Bar {
+  Bar();
+  // The missing expression makes A undeduced.
+  static constexpr auto A = ;  // expected-error {{expected expression}}
+  Foo<decltype(A)>::type B;  // The type of B is also undeduced (wrapped in Elaborated).
+};
+
+// This used to crash when trying to get the layout of B.
+Bar x;
+}
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -17498,8 +17498,13 @@
         Record->setArgPassingRestrictions(RecordDecl::APK_CanNeverPassInRegs);
     }
 
-    if (Record && FD->getType().isVolatileQualified())
-      Record->setHasVolatileMember(true);
+    if (Record) {
+      if (FD->getType().isVolatileQualified())
+        Record->setHasVolatileMember(true);
+      if (const auto *T = FD->getType()->getUnqualifiedDesugaredType())
+        if (T->isUndeducedType())
+          Record->setInvalidDecl();
+    }
     // Keep track of the number of named members.
     if (FD->getIdentifier())
       ++NumNamedMembers;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to