This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG8eaa05d06161: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch (authored by ivanmurashko, committed by DmitryPolukhin).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D106583/new/ https://reviews.llvm.org/D106583 Files: clang/lib/Sema/SemaTemplateDeduction.cpp clang/test/SemaCXX/pr51171-crash.cpp Index: clang/test/SemaCXX/pr51171-crash.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/pr51171-crash.cpp @@ -0,0 +1,33 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s + +// Ensure that we don't crash if errors are suppressed by an error limit. +// RUN: not %clang_cc1 -fsyntax-only -std=c++17 -ferror-limit 1 %s + +template <bool is_const, typename tag_t = void> +struct tv_val { +}; + +template <bool is_const> +auto &val(const tv_val<is_const> &val) { return val.val(); } // expected-note {{possible target for call}} + +struct Class { + template <bool is_const> + struct Entry { + tv_val<is_const> val; + }; +}; + +enum Types : int { + Class = 1, // expected-note 2 {{struct 'Class' is hidden}} +}; + +struct Record { + Class *val_; // expected-error {{must use 'struct' tag}} + void setClass(Class *); // expected-error {{must use 'struct' tag}} +}; + +void Record::setClass(Class *val) { // expected-error {{variable has incomplete type 'void'}} \ + // expected-error {{reference to overloaded function}} \ + // expected-error {{expected ';' after top level declarator}} + val_ = val; +} Index: clang/lib/Sema/SemaTemplateDeduction.cpp =================================================================== --- clang/lib/Sema/SemaTemplateDeduction.cpp +++ clang/lib/Sema/SemaTemplateDeduction.cpp @@ -4346,7 +4346,7 @@ HasDeducedReturnType = true; } - if (!ArgFunctionType.isNull()) { + if (!ArgFunctionType.isNull() && !FunctionType.isNull()) { unsigned TDF = TDF_TopLevelParameterTypeList | TDF_AllowCompatibleFunctionType; // Deduce template arguments from the function type.
Index: clang/test/SemaCXX/pr51171-crash.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/pr51171-crash.cpp @@ -0,0 +1,33 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s + +// Ensure that we don't crash if errors are suppressed by an error limit. +// RUN: not %clang_cc1 -fsyntax-only -std=c++17 -ferror-limit 1 %s + +template <bool is_const, typename tag_t = void> +struct tv_val { +}; + +template <bool is_const> +auto &val(const tv_val<is_const> &val) { return val.val(); } // expected-note {{possible target for call}} + +struct Class { + template <bool is_const> + struct Entry { + tv_val<is_const> val; + }; +}; + +enum Types : int { + Class = 1, // expected-note 2 {{struct 'Class' is hidden}} +}; + +struct Record { + Class *val_; // expected-error {{must use 'struct' tag}} + void setClass(Class *); // expected-error {{must use 'struct' tag}} +}; + +void Record::setClass(Class *val) { // expected-error {{variable has incomplete type 'void'}} \ + // expected-error {{reference to overloaded function}} \ + // expected-error {{expected ';' after top level declarator}} + val_ = val; +} Index: clang/lib/Sema/SemaTemplateDeduction.cpp =================================================================== --- clang/lib/Sema/SemaTemplateDeduction.cpp +++ clang/lib/Sema/SemaTemplateDeduction.cpp @@ -4346,7 +4346,7 @@ HasDeducedReturnType = true; } - if (!ArgFunctionType.isNull()) { + if (!ArgFunctionType.isNull() && !FunctionType.isNull()) { unsigned TDF = TDF_TopLevelParameterTypeList | TDF_AllowCompatibleFunctionType; // Deduce template arguments from the function type.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits