[clang] [clang] Avoid crash due to unimplemented StructuralValue support in the template differ (PR #93265)
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)
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)
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)
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)
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)
@@ -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)
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)
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)
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)
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)
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