[clang] [clang] Mark ill-formed partial specialization as invalid (PR #89536)

2024-04-24 Thread Vlad Serebrennikov via cfe-commits

https://github.com/Endilll closed 
https://github.com/llvm/llvm-project/pull/89536
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Mark ill-formed partial specialization as invalid (PR #89536)

2024-04-22 Thread Vlad Serebrennikov via cfe-commits

https://github.com/Endilll updated 
https://github.com/llvm/llvm-project/pull/89536

>From 58058a88305c7d4c1b1a30d8572ca481889ea3f9 Mon Sep 17 00:00:00 2001
From: Vlad Serebrennikov 
Date: Sun, 21 Apr 2024 13:29:39 +0300
Subject: [PATCH 1/2] [clang] Mark ill-formed partial specialization as invalid

Fixes #89374
Solution suggested by @cor3ntin
---
 clang/lib/Sema/SemaTemplate.cpp   |  2 ++
 clang/lib/Sema/SemaTemplateDeduction.cpp  |  3 ++
 .../test/SemaCXX/template-specialization.cpp  | 28 +++
 3 files changed, 33 insertions(+)

diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index d4976f9d0d11d8..2bcbc081750b31 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -9459,6 +9459,7 @@ DeclResult Sema::ActOnClassTemplateSpecialization(
   Diag(TemplateNameLoc, diag::err_partial_spec_fully_specialized)
 << ClassTemplate->getDeclName();
   isPartialSpecialization = false;
+  Invalid = true;
 }
   }
 
@@ -9674,6 +9675,7 @@ DeclResult Sema::ActOnClassTemplateSpecialization(
   if (SkipBody && SkipBody->ShouldSkip)
 return SkipBody->Previous;
 
+  Specialization->setInvalidDecl(Invalid);
   return Specialization;
 }
 
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp 
b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 0b6375001f5326..c3815bca038554 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -1914,6 +1914,9 @@ static TemplateDeductionResult 
DeduceTemplateArgumentsByTypeMatch(
   if (!S.isCompleteType(Info.getLocation(), A))
 return Result;
 
+  if (getCanonicalRD(A)->isInvalidDecl())
+return Result;
+
   // Reset the incorrectly deduced argument from above.
   Deduced = DeducedOrig;
 
diff --git a/clang/test/SemaCXX/template-specialization.cpp 
b/clang/test/SemaCXX/template-specialization.cpp
index 7b26ff9f5c5ba4..eabb84f2e13d3e 100644
--- a/clang/test/SemaCXX/template-specialization.cpp
+++ b/clang/test/SemaCXX/template-specialization.cpp
@@ -52,3 +52,31 @@ void instantiate() {
 }
 
 }
+
+namespace GH89374 {
+
+struct A {};
+
+template 
+struct MatrixBase { // #GH89374-MatrixBase
+  template 
+  Derived =(const MatrixBase &); // 
#GH89374-copy-assignment
+};
+
+template 
+struct solve_retval;
+
+template 
+struct solve_retval : MatrixBase > {};
+// expected-error@-1 {{partial specialization of 'solve_retval' does not use 
any of its template parameters}}
+
+void ApproximateChebyshev() {
+  MatrixBase c;
+  c = solve_retval();
+  // expected-error@-1 {{no viable overloaded '='}}
+  //   expected-note@#GH89374-copy-assignment {{candidate template ignored: 
could not match 'MatrixBase' against 'solve_retval'}}
+  //   expected-note@#GH89374-MatrixBase {{candidate function (the implicit 
copy assignment operator) not viable: no known conversion from 
'solve_retval' to 'const MatrixBase' for 1st argument}}
+  //   expected-note@#GH89374-MatrixBase {{candidate function (the implicit 
move assignment operator) not viable: no known conversion from 
'solve_retval' to 'MatrixBase' for 1st argument}}
+}
+
+} // namespace GH89374

>From 933dd4d4da75635016bc520d4e0ed7ae96fd372d Mon Sep 17 00:00:00 2001
From: Vlad Serebrennikov 
Date: Tue, 23 Apr 2024 08:18:48 +0300
Subject: [PATCH 2/2] Add a release note

---
 clang/docs/ReleaseNotes.rst | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index c44f238e33846b..da1ca7ffcc353d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -409,6 +409,9 @@ Bug Fixes in This Version
   operator.
   Fixes (#GH83267).
 
+- Fix crash on ill-formed partial specialization with CRTP.
+  Fixes (#GH89374).
+
 - Clang now correctly generates overloads for bit-precise integer types for
   builtin operators in C++. Fixes #GH82998.
 

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


[clang] [clang] Mark ill-formed partial specialization as invalid (PR #89536)

2024-04-22 Thread Erich Keane via cfe-commits

https://github.com/erichkeane approved this pull request.

Release note, else LGTM.

https://github.com/llvm/llvm-project/pull/89536
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Mark ill-formed partial specialization as invalid (PR #89536)

2024-04-21 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Vlad Serebrennikov (Endilll)


Changes

Fixes #89374
Solution suggested by @cor3ntin

---
Full diff: https://github.com/llvm/llvm-project/pull/89536.diff


3 Files Affected:

- (modified) clang/lib/Sema/SemaTemplate.cpp (+2) 
- (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (+3) 
- (modified) clang/test/SemaCXX/template-specialization.cpp (+28) 


``diff
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index d4976f9d0d11d8..2bcbc081750b31 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -9459,6 +9459,7 @@ DeclResult Sema::ActOnClassTemplateSpecialization(
   Diag(TemplateNameLoc, diag::err_partial_spec_fully_specialized)
 << ClassTemplate->getDeclName();
   isPartialSpecialization = false;
+  Invalid = true;
 }
   }
 
@@ -9674,6 +9675,7 @@ DeclResult Sema::ActOnClassTemplateSpecialization(
   if (SkipBody && SkipBody->ShouldSkip)
 return SkipBody->Previous;
 
+  Specialization->setInvalidDecl(Invalid);
   return Specialization;
 }
 
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp 
b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 0b6375001f5326..c3815bca038554 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -1914,6 +1914,9 @@ static TemplateDeductionResult 
DeduceTemplateArgumentsByTypeMatch(
   if (!S.isCompleteType(Info.getLocation(), A))
 return Result;
 
+  if (getCanonicalRD(A)->isInvalidDecl())
+return Result;
+
   // Reset the incorrectly deduced argument from above.
   Deduced = DeducedOrig;
 
diff --git a/clang/test/SemaCXX/template-specialization.cpp 
b/clang/test/SemaCXX/template-specialization.cpp
index 7b26ff9f5c5ba4..eabb84f2e13d3e 100644
--- a/clang/test/SemaCXX/template-specialization.cpp
+++ b/clang/test/SemaCXX/template-specialization.cpp
@@ -52,3 +52,31 @@ void instantiate() {
 }
 
 }
+
+namespace GH89374 {
+
+struct A {};
+
+template 
+struct MatrixBase { // #GH89374-MatrixBase
+  template 
+  Derived =(const MatrixBase &); // 
#GH89374-copy-assignment
+};
+
+template 
+struct solve_retval;
+
+template 
+struct solve_retval : MatrixBase > {};
+// expected-error@-1 {{partial specialization of 'solve_retval' does not use 
any of its template parameters}}
+
+void ApproximateChebyshev() {
+  MatrixBase c;
+  c = solve_retval();
+  // expected-error@-1 {{no viable overloaded '='}}
+  //   expected-note@#GH89374-copy-assignment {{candidate template ignored: 
could not match 'MatrixBase' against 'solve_retval'}}
+  //   expected-note@#GH89374-MatrixBase {{candidate function (the implicit 
copy assignment operator) not viable: no known conversion from 
'solve_retval' to 'const MatrixBase' for 1st argument}}
+  //   expected-note@#GH89374-MatrixBase {{candidate function (the implicit 
move assignment operator) not viable: no known conversion from 
'solve_retval' to 'MatrixBase' for 1st argument}}
+}
+
+} // namespace GH89374

``




https://github.com/llvm/llvm-project/pull/89536
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Mark ill-formed partial specialization as invalid (PR #89536)

2024-04-21 Thread Vlad Serebrennikov via cfe-commits

https://github.com/Endilll created 
https://github.com/llvm/llvm-project/pull/89536

Fixes #89374
Solution suggested by @cor3ntin

>From 58058a88305c7d4c1b1a30d8572ca481889ea3f9 Mon Sep 17 00:00:00 2001
From: Vlad Serebrennikov 
Date: Sun, 21 Apr 2024 13:29:39 +0300
Subject: [PATCH] [clang] Mark ill-formed partial specialization as invalid

Fixes #89374
Solution suggested by @cor3ntin
---
 clang/lib/Sema/SemaTemplate.cpp   |  2 ++
 clang/lib/Sema/SemaTemplateDeduction.cpp  |  3 ++
 .../test/SemaCXX/template-specialization.cpp  | 28 +++
 3 files changed, 33 insertions(+)

diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index d4976f9d0d11d8..2bcbc081750b31 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -9459,6 +9459,7 @@ DeclResult Sema::ActOnClassTemplateSpecialization(
   Diag(TemplateNameLoc, diag::err_partial_spec_fully_specialized)
 << ClassTemplate->getDeclName();
   isPartialSpecialization = false;
+  Invalid = true;
 }
   }
 
@@ -9674,6 +9675,7 @@ DeclResult Sema::ActOnClassTemplateSpecialization(
   if (SkipBody && SkipBody->ShouldSkip)
 return SkipBody->Previous;
 
+  Specialization->setInvalidDecl(Invalid);
   return Specialization;
 }
 
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp 
b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 0b6375001f5326..c3815bca038554 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -1914,6 +1914,9 @@ static TemplateDeductionResult 
DeduceTemplateArgumentsByTypeMatch(
   if (!S.isCompleteType(Info.getLocation(), A))
 return Result;
 
+  if (getCanonicalRD(A)->isInvalidDecl())
+return Result;
+
   // Reset the incorrectly deduced argument from above.
   Deduced = DeducedOrig;
 
diff --git a/clang/test/SemaCXX/template-specialization.cpp 
b/clang/test/SemaCXX/template-specialization.cpp
index 7b26ff9f5c5ba4..eabb84f2e13d3e 100644
--- a/clang/test/SemaCXX/template-specialization.cpp
+++ b/clang/test/SemaCXX/template-specialization.cpp
@@ -52,3 +52,31 @@ void instantiate() {
 }
 
 }
+
+namespace GH89374 {
+
+struct A {};
+
+template 
+struct MatrixBase { // #GH89374-MatrixBase
+  template 
+  Derived =(const MatrixBase &); // 
#GH89374-copy-assignment
+};
+
+template 
+struct solve_retval;
+
+template 
+struct solve_retval : MatrixBase > {};
+// expected-error@-1 {{partial specialization of 'solve_retval' does not use 
any of its template parameters}}
+
+void ApproximateChebyshev() {
+  MatrixBase c;
+  c = solve_retval();
+  // expected-error@-1 {{no viable overloaded '='}}
+  //   expected-note@#GH89374-copy-assignment {{candidate template ignored: 
could not match 'MatrixBase' against 'solve_retval'}}
+  //   expected-note@#GH89374-MatrixBase {{candidate function (the implicit 
copy assignment operator) not viable: no known conversion from 
'solve_retval' to 'const MatrixBase' for 1st argument}}
+  //   expected-note@#GH89374-MatrixBase {{candidate function (the implicit 
move assignment operator) not viable: no known conversion from 
'solve_retval' to 'MatrixBase' for 1st argument}}
+}
+
+} // namespace GH89374

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