adamcz updated this revision to Diff 356925. adamcz added a comment. changed to marking field type as invalid
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105478/new/ https://reviews.llvm.org/D105478 Files: clang/lib/Sema/SemaDecl.cpp clang/test/AST/ast-dump-undeduced-field.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/test/AST/ast-dump-undeduced-field.cpp =================================================================== --- /dev/null +++ clang/test/AST/ast-dump-undeduced-field.cpp @@ -0,0 +1,15 @@ +// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -ast-dump %s | FileCheck %s + +template< class T > +struct Foo { + typedef T type; +}; + +struct Bar { + Bar(); + static constexpr auto A = ; + Foo<decltype(A)>::type baz; +}; + +// CHECK: -CXXRecordDecl {{.*}} invalid struct Bar definition +// CHECK: -FieldDecl {{.*}} invalid baz {{.*}} Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -16759,6 +16759,9 @@ TInfo = Context.getTrivialTypeSourceInfo(T, Loc); } } + if (const auto *U = T->getUnqualifiedDesugaredType()) + if (U->isUndeducedType()) + D.setInvalidType(); DiagnoseFunctionSpecifiers(D.getDeclSpec());
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/test/AST/ast-dump-undeduced-field.cpp =================================================================== --- /dev/null +++ clang/test/AST/ast-dump-undeduced-field.cpp @@ -0,0 +1,15 @@ +// RUN: not %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -ast-dump %s | FileCheck %s + +template< class T > +struct Foo { + typedef T type; +}; + +struct Bar { + Bar(); + static constexpr auto A = ; + Foo<decltype(A)>::type baz; +}; + +// CHECK: -CXXRecordDecl {{.*}} invalid struct Bar definition +// CHECK: -FieldDecl {{.*}} invalid baz {{.*}} Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -16759,6 +16759,9 @@ TInfo = Context.getTrivialTypeSourceInfo(T, Loc); } } + if (const auto *U = T->getUnqualifiedDesugaredType()) + if (U->isUndeducedType()) + D.setInvalidType(); DiagnoseFunctionSpecifiers(D.getDeclSpec());
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits