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