[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-24 Thread Matheus Izvekov via cfe-commits

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


[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-24 Thread Matheus Izvekov via cfe-commits

https://github.com/mizvekov updated 
https://github.com/llvm/llvm-project/pull/93265

>From 2546c2c5d9e1bc6d1d4ddd818b4017073f17cec0 Mon Sep 17 00:00:00 2001
From: Matheus Izvekov 
Date: Thu, 23 May 2024 21:23:21 -0300
Subject: [PATCH] [clang] Avoid crash due to unimplemented StructuralValue
 support in the template differ

This was not implemented in https://github.com/llvm/llvm-project/pull/78041

This patch does not implement this fucntionality, it just falls back to the 
expression
when possible.

Otherwise, such as when dealing with canonical types to begin with,
this will just ignore the argument as if it wasn't even there.

Fixes https://github.com/llvm/llvm-project/issues/93068
---
 clang/docs/ReleaseNotes.rst   |   1 +
 clang/lib/AST/ASTDiagnostic.cpp   | 106 +++---
 ...ng.cpp => diag-template-diffing-cxx11.cpp} |   0
 .../test/Misc/diag-template-diffing-cxx26.cpp |  49 
 4 files changed, 114 insertions(+), 42 deletions(-)
 rename clang/test/Misc/{diag-template-diffing.cpp => 
diag-template-diffing-cxx11.cpp} (100%)
 create mode 100644 clang/test/Misc/diag-template-diffing-cxx26.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7bcdee96e213e..6e8687fadc6f7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -790,6 +790,7 @@ Miscellaneous Clang Crashes Fixed
 
 - Do not attempt to dump the layout of dependent types or invalid declarations
   when ``-fdump-record-layouts-complete`` is passed. Fixes #GH83684.
+- Unhandled StructuralValues in the template differ (#GH93068).
 
 OpenACC Specific Changes
 
diff --git a/clang/lib/AST/ASTDiagnostic.cpp b/clang/lib/AST/ASTDiagnostic.cpp
index 91bc1b22acfc7..5c7afaaf2ca8f 100644
--- a/clang/lib/AST/ASTDiagnostic.cpp
+++ b/clang/lib/AST/ASTDiagnostic.cpp
@@ -1215,46 +1215,19 @@ class TemplateDiff {
  bool &NeedAddressOf) {
 if (!Iter.isEnd()) {
   switch (Iter->getKind()) {
-default:
-  llvm_unreachable("unknown ArgumentKind");
-case TemplateArgument::Integral:
-  Value = Iter->getAsIntegral();
-  HasInt = true;
-  IntType = Iter->getIntegralType();
-  return;
-case TemplateArgument::Declaration: {
-  VD = Iter->getAsDecl();
-  QualType ArgType = Iter->getParamTypeForDecl();
-  QualType VDType = VD->getType();
-  if (ArgType->isPointerType() &&
-  Context.hasSameType(ArgType->getPointeeType(), VDType))
-NeedAddressOf = true;
-  return;
-}
-case TemplateArgument::NullPtr:
-  IsNullPtr = true;
-  return;
-case TemplateArgument::Expression:
-  E = Iter->getAsExpr();
-  }
-} else if (!Default->isParameterPack()) {
-  E = Default->getDefaultArgument().getArgument().getAsExpr();
-}
-
-if (!Iter.hasDesugaredTA()) return;
-
-const TemplateArgument& TA = Iter.getDesugaredTA();
-switch (TA.getKind()) {
-  default:
-llvm_unreachable("unknown ArgumentKind");
+  case TemplateArgument::StructuralValue:
+// FIXME: Diffing of structural values is not implemented.
+// There is no possible fallback in this case, this will show up
+// as '(no argument)'.
+return;
   case TemplateArgument::Integral:
-Value = TA.getAsIntegral();
+Value = Iter->getAsIntegral();
 HasInt = true;
-IntType = TA.getIntegralType();
+IntType = Iter->getIntegralType();
 return;
   case TemplateArgument::Declaration: {
-VD = TA.getAsDecl();
-QualType ArgType = TA.getParamTypeForDecl();
+VD = Iter->getAsDecl();
+QualType ArgType = Iter->getParamTypeForDecl();
 QualType VDType = VD->getType();
 if (ArgType->isPointerType() &&
 Context.hasSameType(ArgType->getPointeeType(), VDType))
@@ -1265,13 +1238,62 @@ class TemplateDiff {
 IsNullPtr = true;
 return;
   case TemplateArgument::Expression:
-// TODO: Sometimes, the desugared template argument Expr differs from
-// the sugared template argument Expr.  It may be useful in the future
-// but for now, it is just discarded.
-if (!E)
-  E = TA.getAsExpr();
-return;
+E = Iter->getAsExpr();
+break;
+  case TemplateArgument::Null:
+  case TemplateArgument::Type:
+  case TemplateArgument::Template:
+  case TemplateArgument::TemplateExpansion:
+llvm_unreachable("TemplateArgument kind is not expected for NTTP");
+  case TemplateArgument::Pack:
+llvm_unreachable("TemplateArgument kind should be handled elsewhere");
+  }
+} else if (!Default->isParameterPack()) {
+  E = Default->getDefaultArgument().getArgument().getAsExpr();
 }
+
+if (!Iter.hasDesugaredTA())
+  return;
+
+const Templat

[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-24 Thread Erich Keane via cfe-commits

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


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


[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-24 Thread Matheus Izvekov via cfe-commits

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


[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-24 Thread Matheus Izvekov via cfe-commits




mizvekov wrote:

We usually create new tests under the latest standard.

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


[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-24 Thread Andrey Ali Khan Bolshakov via cfe-commits


@@ -1265,13 +1238,62 @@ class TemplateDiff {
 IsNullPtr = true;
 return;
   case TemplateArgument::Expression:
-// TODO: Sometimes, the desugared template argument Expr differs from
-// the sugared template argument Expr.  It may be useful in the future
-// but for now, it is just discarded.
-if (!E)
-  E = TA.getAsExpr();
-return;
+E = Iter->getAsExpr();
+break;
+  case TemplateArgument::Null:
+  case TemplateArgument::Type:
+  case TemplateArgument::Template:
+  case TemplateArgument::TemplateExpansion:
+llvm_unreachable("TemplateArgument kind is not expected for NTTP");
+  case TemplateArgument::Pack:
+llvm_unreachable("TemplateArgument kind handled elsewhere");

bolshakov-a wrote:

Nit: "... _should be_ handled ..."?

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


[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-24 Thread Andrey Ali Khan Bolshakov via cfe-commits

https://github.com/bolshakov-a approved this pull request.

One question about the version of the C++ standard under testing, otherwise 
LGTM, thanks!

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


[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-24 Thread Andrey Ali Khan Bolshakov via cfe-commits

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


[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-24 Thread Andrey Ali Khan Bolshakov via cfe-commits




bolshakov-a wrote:

I don't see any C++26-specific stuff here, only C++20.

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


[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-23 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Matheus Izvekov (mizvekov)


Changes

This was not implemented in https://github.com/llvm/llvm-project/pull/78041 
when StructuralValue TemplateArguments were originally added.

This patch does not implement this functionality, it just falls back to the 
expression when possible.

Otherwise, such as when dealing with canonical types to begin with, this will 
just ignore the argument as if it wasn't even there.

Fixes https://github.com/llvm/llvm-project/issues/93068

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


4 Files Affected:

- (modified) clang/docs/ReleaseNotes.rst (+1) 
- (modified) clang/lib/AST/ASTDiagnostic.cpp (+64-42) 
- (renamed) clang/test/Misc/diag-template-diffing-cxx11.cpp () 
- (added) clang/test/Misc/diag-template-diffing-cxx26.cpp (+49) 


``diff
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7bcdee96e213e..6e8687fadc6f7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -790,6 +790,7 @@ Miscellaneous Clang Crashes Fixed
 
 - Do not attempt to dump the layout of dependent types or invalid declarations
   when ``-fdump-record-layouts-complete`` is passed. Fixes #GH83684.
+- Unhandled StructuralValues in the template differ (#GH93068).
 
 OpenACC Specific Changes
 
diff --git a/clang/lib/AST/ASTDiagnostic.cpp b/clang/lib/AST/ASTDiagnostic.cpp
index 91bc1b22acfc7..7e4a5709a44ce 100644
--- a/clang/lib/AST/ASTDiagnostic.cpp
+++ b/clang/lib/AST/ASTDiagnostic.cpp
@@ -1215,46 +1215,19 @@ class TemplateDiff {
  bool &NeedAddressOf) {
 if (!Iter.isEnd()) {
   switch (Iter->getKind()) {
-default:
-  llvm_unreachable("unknown ArgumentKind");
-case TemplateArgument::Integral:
-  Value = Iter->getAsIntegral();
-  HasInt = true;
-  IntType = Iter->getIntegralType();
-  return;
-case TemplateArgument::Declaration: {
-  VD = Iter->getAsDecl();
-  QualType ArgType = Iter->getParamTypeForDecl();
-  QualType VDType = VD->getType();
-  if (ArgType->isPointerType() &&
-  Context.hasSameType(ArgType->getPointeeType(), VDType))
-NeedAddressOf = true;
-  return;
-}
-case TemplateArgument::NullPtr:
-  IsNullPtr = true;
-  return;
-case TemplateArgument::Expression:
-  E = Iter->getAsExpr();
-  }
-} else if (!Default->isParameterPack()) {
-  E = Default->getDefaultArgument().getArgument().getAsExpr();
-}
-
-if (!Iter.hasDesugaredTA()) return;
-
-const TemplateArgument& TA = Iter.getDesugaredTA();
-switch (TA.getKind()) {
-  default:
-llvm_unreachable("unknown ArgumentKind");
+  case TemplateArgument::StructuralValue:
+// FIXME: Diffing of structural values is not implemented.
+// There is no possible fallback in this case, this will show up
+// as '(no argument)'.
+return;
   case TemplateArgument::Integral:
-Value = TA.getAsIntegral();
+Value = Iter->getAsIntegral();
 HasInt = true;
-IntType = TA.getIntegralType();
+IntType = Iter->getIntegralType();
 return;
   case TemplateArgument::Declaration: {
-VD = TA.getAsDecl();
-QualType ArgType = TA.getParamTypeForDecl();
+VD = Iter->getAsDecl();
+QualType ArgType = Iter->getParamTypeForDecl();
 QualType VDType = VD->getType();
 if (ArgType->isPointerType() &&
 Context.hasSameType(ArgType->getPointeeType(), VDType))
@@ -1265,13 +1238,62 @@ class TemplateDiff {
 IsNullPtr = true;
 return;
   case TemplateArgument::Expression:
-// TODO: Sometimes, the desugared template argument Expr differs from
-// the sugared template argument Expr.  It may be useful in the future
-// but for now, it is just discarded.
-if (!E)
-  E = TA.getAsExpr();
-return;
+E = Iter->getAsExpr();
+break;
+  case TemplateArgument::Null:
+  case TemplateArgument::Type:
+  case TemplateArgument::Template:
+  case TemplateArgument::TemplateExpansion:
+llvm_unreachable("TemplateArgument kind is not expected for NTTP");
+  case TemplateArgument::Pack:
+llvm_unreachable("TemplateArgument kind handled elsewhere");
+  }
+} else if (!Default->isParameterPack()) {
+  E = Default->getDefaultArgument().getArgument().getAsExpr();
 }
+
+if (!Iter.hasDesugaredTA())
+  return;
+
+const TemplateArgument &TA = Iter.getDesugaredTA();
+switch (TA.getKind()) {
+case TemplateArgument::StructuralValue:
+  // FIXME: Diffing of structural values is not implemented.
+  //Just fall back to the expression.
+  return;
+case TemplateArgument::Integral:
+  Value = TA.get

[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)

2024-05-23 Thread Matheus Izvekov via cfe-commits

https://github.com/mizvekov created 
https://github.com/llvm/llvm-project/pull/93265

This was not implemented in https://github.com/llvm/llvm-project/pull/78041 
when StructuralValue TemplateArguments were originally added.

This patch does not implement this functionality, it just falls back to the 
expression when possible.

Otherwise, such as when dealing with canonical types to begin with, this will 
just ignore the argument as if it wasn't even there.

Fixes https://github.com/llvm/llvm-project/issues/93068

>From c7a056d39dd4148cc8872e8ca136a9f9525ff654 Mon Sep 17 00:00:00 2001
From: Matheus Izvekov 
Date: Thu, 23 May 2024 21:23:21 -0300
Subject: [PATCH] [clang] Avoid crash due to unimplemented StructuralValue
 support in the template differ

This was not implemented in https://github.com/llvm/llvm-project/pull/78041

This patch does not implement this fucntionality, it just falls back to the 
expression
when possible.

Otherwise, such as when dealing with canonical types to begin with,
this will just ignore the argument as if it wasn't even there.

Fixes https://github.com/llvm/llvm-project/issues/93068
---
 clang/docs/ReleaseNotes.rst   |   1 +
 clang/lib/AST/ASTDiagnostic.cpp   | 106 +++---
 ...ng.cpp => diag-template-diffing-cxx11.cpp} |   0
 .../test/Misc/diag-template-diffing-cxx26.cpp |  49 
 4 files changed, 114 insertions(+), 42 deletions(-)
 rename clang/test/Misc/{diag-template-diffing.cpp => 
diag-template-diffing-cxx11.cpp} (100%)
 create mode 100644 clang/test/Misc/diag-template-diffing-cxx26.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7bcdee96e213e..6e8687fadc6f7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -790,6 +790,7 @@ Miscellaneous Clang Crashes Fixed
 
 - Do not attempt to dump the layout of dependent types or invalid declarations
   when ``-fdump-record-layouts-complete`` is passed. Fixes #GH83684.
+- Unhandled StructuralValues in the template differ (#GH93068).
 
 OpenACC Specific Changes
 
diff --git a/clang/lib/AST/ASTDiagnostic.cpp b/clang/lib/AST/ASTDiagnostic.cpp
index 91bc1b22acfc7..7e4a5709a44ce 100644
--- a/clang/lib/AST/ASTDiagnostic.cpp
+++ b/clang/lib/AST/ASTDiagnostic.cpp
@@ -1215,46 +1215,19 @@ class TemplateDiff {
  bool &NeedAddressOf) {
 if (!Iter.isEnd()) {
   switch (Iter->getKind()) {
-default:
-  llvm_unreachable("unknown ArgumentKind");
-case TemplateArgument::Integral:
-  Value = Iter->getAsIntegral();
-  HasInt = true;
-  IntType = Iter->getIntegralType();
-  return;
-case TemplateArgument::Declaration: {
-  VD = Iter->getAsDecl();
-  QualType ArgType = Iter->getParamTypeForDecl();
-  QualType VDType = VD->getType();
-  if (ArgType->isPointerType() &&
-  Context.hasSameType(ArgType->getPointeeType(), VDType))
-NeedAddressOf = true;
-  return;
-}
-case TemplateArgument::NullPtr:
-  IsNullPtr = true;
-  return;
-case TemplateArgument::Expression:
-  E = Iter->getAsExpr();
-  }
-} else if (!Default->isParameterPack()) {
-  E = Default->getDefaultArgument().getArgument().getAsExpr();
-}
-
-if (!Iter.hasDesugaredTA()) return;
-
-const TemplateArgument& TA = Iter.getDesugaredTA();
-switch (TA.getKind()) {
-  default:
-llvm_unreachable("unknown ArgumentKind");
+  case TemplateArgument::StructuralValue:
+// FIXME: Diffing of structural values is not implemented.
+// There is no possible fallback in this case, this will show up
+// as '(no argument)'.
+return;
   case TemplateArgument::Integral:
-Value = TA.getAsIntegral();
+Value = Iter->getAsIntegral();
 HasInt = true;
-IntType = TA.getIntegralType();
+IntType = Iter->getIntegralType();
 return;
   case TemplateArgument::Declaration: {
-VD = TA.getAsDecl();
-QualType ArgType = TA.getParamTypeForDecl();
+VD = Iter->getAsDecl();
+QualType ArgType = Iter->getParamTypeForDecl();
 QualType VDType = VD->getType();
 if (ArgType->isPointerType() &&
 Context.hasSameType(ArgType->getPointeeType(), VDType))
@@ -1265,13 +1238,62 @@ class TemplateDiff {
 IsNullPtr = true;
 return;
   case TemplateArgument::Expression:
-// TODO: Sometimes, the desugared template argument Expr differs from
-// the sugared template argument Expr.  It may be useful in the future
-// but for now, it is just discarded.
-if (!E)
-  E = TA.getAsExpr();
-return;
+E = Iter->getAsExpr();
+break;
+  case TemplateArgument::Null:
+  case TemplateArgument::Type:
+  case TemplateArgument::Template:
+  ca