diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -4492,7 +4492,8 @@ // Find expected alignment, and the actual alignment of the passed object. // getTypeAlignInChars requires complete types - if (ParamTy->isIncompleteType() || ArgTy->isIncompleteType()) + if (ParamTy->isIncompleteType() || ArgTy->isIncompleteType() || + ParamTy->isUndeducedType() || ArgTy->isUndeducedType()) return; CharUnits ParamAlign = Context.getTypeAlignInChars(ParamTy); diff --git a/clang/test/Sema/check-arg-alignment.cpp b/clang/test/Sema/check-arg-alignment.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Sema/check-arg-alignment.cpp @@ -0,0 +1,13 @@ +// Ensure we don't crash when CTAD fails. +// RUN: %clang_cc1 -std=c++17 -verify %s +template +struct Foo { // expected-note{{candidate function template not viable}} + Foo(T1, T2); // expected-note{{candidate function template not viable}} +}; + +template +void insert(Args &&...args); + +void foo() { + insert(Foo(2, 2, 2)); // expected-error{{no viable constructor or deduction guide}} +}