[PATCH] D106583: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch

2021-07-30 Thread Dmitry Polukhin via Phabricator via cfe-commits
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 
+struct tv_val {
+};
+
+template 
+auto (const tv_val ) { return val.val(); } // expected-note 
{{possible target for call}}
+
+struct Class {
+  template 
+  struct Entry {
+tv_val 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 
+struct tv_val {
+};
+
+template 
+auto (const tv_val ) { return val.val(); } // expected-note {{possible target for call}}
+
+struct Class {
+  template 
+  struct Entry {
+tv_val 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


[PATCH] D106583: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch

2021-07-23 Thread Erich Keane via Phabricator via cfe-commits
erichkeane accepted this revision.
erichkeane added a subscriber: rjmccall.
erichkeane added a comment.
This revision is now accepted and ready to land.

That test is fine, though the errors are quite jarring!  I'm surprised how 
confused we get!

This looks acceptable to me, but I'm not sufficiently an expert in this code to 
accept right away.  Please give @rsmith (or perhaps @rjmccall ) at least 24 hrs 
after this to take a look before pushing.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106583/new/

https://reviews.llvm.org/D106583

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106583: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch

2021-07-23 Thread Ivan Murashko via Phabricator via cfe-commits
ivanmurashko added a comment.

@erichkeane, could you look at the added LIT test. Is it suitable or require 
additional modifications?

BTW: There are several failed tests but they seems to be a known issue (see bug 
51117 ).


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106583/new/

https://reviews.llvm.org/D106583

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106583: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch

2021-07-22 Thread Ivan Murashko via Phabricator via cfe-commits
ivanmurashko updated this revision to Diff 361005.
ivanmurashko added a comment.

LIT test was updated


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 
+struct tv_val {
+};
+
+template 
+auto (const tv_val ) { return val.val(); } // expected-note 
{{possible target for call}}
+
+struct Class {
+  template 
+  struct Entry {
+tv_val 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 
+struct tv_val {
+};
+
+template 
+auto (const tv_val ) { return val.val(); } // expected-note {{possible target for call}}
+
+struct Class {
+  template 
+  struct Entry {
+tv_val 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


[PATCH] D106583: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch

2021-07-22 Thread Ivan Murashko via Phabricator via cfe-commits
ivanmurashko updated this revision to Diff 361001.
ivanmurashko added a comment.

The LIT test was added:

  build] ./bin/llvm-lit -v ../clang/test/SemaCXX/pr51171-crash.cpp


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,36 @@
+// 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 
+struct tv_val {
+};
+
+template 
+auto (const tv_val ) { return val.val(); } // expected-note 
{{possible target for call}}
+
+struct Class {
+  template 
+  struct Entry {
+tv_val val;
+  };
+};
+
+enum Types : int {
+  Class = 1, // expected-note {{struct 'Class' is hidden}} \
+   // expected-note {{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;
+}
+
+/// expected-fatal {{too many errors emitted, stopping now [-ferror-limit=]}}
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,36 @@
+// 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 
+struct tv_val {
+};
+
+template 
+auto (const tv_val ) { return val.val(); } // expected-note {{possible target for call}}
+
+struct Class {
+  template 
+  struct Entry {
+tv_val val;
+  };
+};
+
+enum Types : int {
+  Class = 1, // expected-note {{struct 'Class' is hidden}} \
+   // expected-note {{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;
+}
+
+/// expected-fatal {{too many errors emitted, stopping now [-ferror-limit=]}}
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


[PATCH] D106583: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch

2021-07-22 Thread Erich Keane via Phabricator via cfe-commits
erichkeane added a comment.

In D106583#2897783 , @ivanmurashko 
wrote:

> @erichkeane, is it OK if the reproducer be added as the LIT test?

That is a typical mechanism way to go, but that reproducer is a little long.  
You should hopefully be able to simplify it to the minimum required to 
reproduce the crash.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106583/new/

https://reviews.llvm.org/D106583

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106583: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch

2021-07-22 Thread Ivan Murashko via Phabricator via cfe-commits
ivanmurashko added a comment.

@erichkeane, is it OK if the reproducer will be added as the LIT test?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106583/new/

https://reviews.llvm.org/D106583

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106583: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch

2021-07-22 Thread Erich Keane via Phabricator via cfe-commits
erichkeane added a comment.

This seems appropriate of a fix, but it needs a lit test.  I'm not particularly 
sure I know the repercussions of this patch, however perhaps that would help.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D106583/new/

https://reviews.llvm.org/D106583

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D106583: [clang] SIGSEGV at DeduceTemplateArgumentsByTypeMatch

2021-07-22 Thread Ivan Murashko via Phabricator via cfe-commits
ivanmurashko created this revision.
ivanmurashko added reviewers: rsmith, DmitryPolukhin.
ivanmurashko requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

There is a SIGSEGV at DeduceTemplateArgumentsByTypeMatch. See BUG description 
and reproducer at https://bugs.llvm.org/show_bug.cgi?id=51171

The stack trace is below:

   #0 0x055afcb9 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) 
/home/ivanmurashko/local/llvm-project/llvm/lib/Support/Unix/Signals.inc:565:22
   #1 0x055afd70 PrintStackTraceSignalHandler(void*) 
/home/ivanmurashko/local/llvm-project/llvm/lib/Support/Unix/Signals.inc:632:1
   #2 0x055add2d llvm::sys::RunSignalHandlers() 
/home/ivanmurashko/local/llvm-project/llvm/lib/Support/Signals.cpp:97:20
   #3 0x055af701 SignalHandler(int) 
/home/ivanmurashko/local/llvm-project/llvm/lib/Support/Unix/Signals.inc:407:1
   #4 0x77bc2b20 __restore_rt sigaction.c:0:0
   #5 0x766a337f raise (/lib64/libc.so.6+0x3737f)
   #6 0x7668ddb5 abort (/lib64/libc.so.6+0x21db5)
   #7 0x7668dc89 _nl_load_domain.cold.0 loadmsgcat.c:0:0
   #8 0x7669ba76 .annobin___GI___assert_fail.end assert.c:0:0
   #9 0x0594b210 clang::QualType::getCommonPtr() const 
/home/ivanmurashko/local/llvm-project/clang/include/clang/AST/Type.h:684:5
  #10 0x05a12ca6 clang::QualType::getCanonicalType() const 
/home/ivanmurashko/local/llvm-project/clang/include/clang/AST/Type.h:6467:36
  #11 0x05a137a6 clang::ASTContext::getCanonicalType(clang::QualType) 
const 
/home/ivanmurashko/local/llvm-project/clang/include/clang/AST/ASTContext.h:2433:58
  #12 0x09204584 DeduceTemplateArgumentsByTypeMatch(clang::Sema&, 
clang::TemplateParameterList*, clang::QualType, clang::QualType, 
clang::sema::TemplateDeductionInfo&, 
llvm::SmallVectorImpl&, unsigned int, bool, 
bool) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:1355:54
  #13 0x0920df0d 
clang::Sema::DeduceTemplateArguments(clang::FunctionTemplateDecl*, 
clang::TemplateArgumentListInfo*, clang::QualType, clang::FunctionDecl*&, 
clang::sema::TemplateDeductionInfo&, bool) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaTemplateDeduction.cpp:4354:47
  #14 0x09012b09 (anonymous 
namespace)::AddressOfFunctionResolver::AddMatchingTemplateFunction(clang::FunctionTemplateDecl*,
 clang::DeclAccessPair const&) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:12026:38
  #15 0x09013030 (anonymous 
namespace)::AddressOfFunctionResolver::FindAllFunctionsThatMatchTargetTypeExactly()
 /home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:12119:9
  #16 0x09012679 (anonymous 
namespace)::AddressOfFunctionResolver::AddressOfFunctionResolver(clang::Sema&, 
clang::Expr*, clang::QualType const&, bool) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:11931:5
  #17 0x09013c91 
clang::Sema::ResolveAddressOfOverloadedFunction(clang::Expr*, clang::QualType, 
bool, clang::DeclAccessPair&, bool*) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:12286:42
  #18 0x08fed85d IsStandardConversion(clang::Sema&, clang::Expr*, 
clang::QualType, bool, clang::StandardConversionSequence&, bool, bool) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:1712:49
  #19 0x08fec8ea TryImplicitConversion(clang::Sema&, clang::Expr*, 
clang::QualType, bool, clang::Sema::AllowedExplicit, bool, bool, bool, bool) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:1433:27
  #20 0x08ff90ba TryCopyInitialization(clang::Sema&, clang::Expr*, 
clang::QualType, bool, bool, bool, bool) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:5273:71
  #21 0x090024fb clang::Sema::AddBuiltinCandidate(clang::QualType*, 
llvm::ArrayRef, clang::OverloadCandidateSet&, bool, unsigned int) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:7755:32
  #22 0x0900513f (anonymous 
namespace)::BuiltinOperatorOverloadBuilder::addGenericBinaryArithmeticOverloads()
 /home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:8633:30
  #23 0x09007624 
clang::Sema::AddBuiltinOperatorCandidates(clang::OverloadedOperatorKind, 
clang::SourceLocation, llvm::ArrayRef, 
clang::OverloadCandidateSet&) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:9205:51
  #24 0x09018734 
clang::Sema::LookupOverloadedBinOp(clang::OverloadCandidateSet&, 
clang::OverloadedOperatorKind, clang::UnresolvedSetImpl const&, 
llvm::ArrayRef, bool) 
/home/ivanmurashko/local/llvm-project/clang/lib/Sema/SemaOverload.cpp:13469:1
  #25 0x09018d56 
clang::Sema::CreateOverloadedBinOp(clang::SourceLocation, 
clang::BinaryOperatorKind, clang::UnresolvedSetImpl const&, clang::Expr*, 
clang::Expr*, bool, bool,