ArcsinX created this revision. ArcsinX added reviewers: aaron.ballman, rsmith, mizvekov. Herald added a project: All. ArcsinX requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Without this patch `VarDecl::hasDependent()` checks only undeduced auto types, so can give false negatives result for other undeduced types. This lead to crashes in sequence `!VarDecl::hasDepentent()` => `getDeclAlign()`. It seems this problem appeared since D105380 <https://reviews.llvm.org/D105380> Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D135362 Files: clang/lib/AST/Decl.cpp clang/test/Sema/tls_alignment.cpp Index: clang/test/Sema/tls_alignment.cpp =================================================================== --- clang/test/Sema/tls_alignment.cpp +++ clang/test/Sema/tls_alignment.cpp @@ -1,6 +1,6 @@ // TLS variable cannot be aligned to more than 32 bytes on PS4. -// RUN: %clang_cc1 -triple x86_64-scei-ps4 -fsyntax-only -verify %s +// RUN: %clang_cc1 -triple x86_64-scei-ps4 -std=c++17 -fsyntax-only -verify %s // A non-aligned type. @@ -18,6 +18,12 @@ int some_aligned_data[12] __attribute__(( aligned(64) )); // 48 bytes of stuff, aligned to 64. }; +// A templated type +template <typename> +struct templated_struct {}; +// expected-note@-1{{candidate template ignored: couldn't infer template argument ''}} +// expected-note@-2{{candidate function template not viable: requires 1 argument, but 0 were provided}} + // A typedef of the aligned struct. typedef aligned_struct another_aligned_struct; @@ -42,6 +48,9 @@ // Variable aligned because of typedef, second case. __thread yet_another_aligned_struct bar5; // expected-error{{alignment (64) of thread-local variable}} +// No crash for undeduced type. +__thread templated_struct bar6; // expected-error{{no viable constructor or deduction guide for deduction of template arguments of 'templated_struct'}} + int baz () { return foo.some_data[0] + bar.some_data[1] + bar2.some_data[2] + Index: clang/lib/AST/Decl.cpp =================================================================== --- clang/lib/AST/Decl.cpp +++ clang/lib/AST/Decl.cpp @@ -2581,7 +2581,7 @@ bool VarDecl::hasDependentAlignment() const { QualType T = getType(); - return T->isDependentType() || T->isUndeducedAutoType() || + return T->isDependentType() || T->isUndeducedType() || llvm::any_of(specific_attrs<AlignedAttr>(), [](const AlignedAttr *AA) { return AA->isAlignmentDependent(); });
Index: clang/test/Sema/tls_alignment.cpp =================================================================== --- clang/test/Sema/tls_alignment.cpp +++ clang/test/Sema/tls_alignment.cpp @@ -1,6 +1,6 @@ // TLS variable cannot be aligned to more than 32 bytes on PS4. -// RUN: %clang_cc1 -triple x86_64-scei-ps4 -fsyntax-only -verify %s +// RUN: %clang_cc1 -triple x86_64-scei-ps4 -std=c++17 -fsyntax-only -verify %s // A non-aligned type. @@ -18,6 +18,12 @@ int some_aligned_data[12] __attribute__(( aligned(64) )); // 48 bytes of stuff, aligned to 64. }; +// A templated type +template <typename> +struct templated_struct {}; +// expected-note@-1{{candidate template ignored: couldn't infer template argument ''}} +// expected-note@-2{{candidate function template not viable: requires 1 argument, but 0 were provided}} + // A typedef of the aligned struct. typedef aligned_struct another_aligned_struct; @@ -42,6 +48,9 @@ // Variable aligned because of typedef, second case. __thread yet_another_aligned_struct bar5; // expected-error{{alignment (64) of thread-local variable}} +// No crash for undeduced type. +__thread templated_struct bar6; // expected-error{{no viable constructor or deduction guide for deduction of template arguments of 'templated_struct'}} + int baz () { return foo.some_data[0] + bar.some_data[1] + bar2.some_data[2] + Index: clang/lib/AST/Decl.cpp =================================================================== --- clang/lib/AST/Decl.cpp +++ clang/lib/AST/Decl.cpp @@ -2581,7 +2581,7 @@ bool VarDecl::hasDependentAlignment() const { QualType T = getType(); - return T->isDependentType() || T->isUndeducedAutoType() || + return T->isDependentType() || T->isUndeducedType() || llvm::any_of(specific_attrs<AlignedAttr>(), [](const AlignedAttr *AA) { return AA->isAlignmentDependent(); });
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits