https://github.com/ymand created https://github.com/llvm/llvm-project/pull/103219
There are some external projects that can't rely on our own sugar propagation for templated entities, because they need to resugar types which only exist within their framework, and so are entirely invisible to our internal tooling. This new flag is meant to prevent our transforms from removing any Subst* nodes. For this, this is wired only to template type alias subsititutions. Note that our AST does represent enough information to correctly resugar template type alias, so any users of this are either defective or working under extremely limited scenarios. >From 1e9be117cc92b3af35f51f8e399f9dca5ac3763b Mon Sep 17 00:00:00 2001 From: Matheus Izvekov <mizve...@gmail.com> Date: Thu, 8 Aug 2024 14:22:03 -0300 Subject: [PATCH 1/2] [clang] Add frontend flag to enable support for broken external resugarers There are some external projects that can't rely on our own sugar propagation for templated entities, because they need to resugar types which only exist within their framework, and so are entirely invisible to our internal tooling. This new flag is meant to prevent our transforms from removing any Subst* nodes. For this, this is wired only to template type alias subsititutions. Note that our AST does represent enough information to correctly resugar template type alias, so any users of this are either defective or working under extremely limited scenarios. --- clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 5 +++++ clang/lib/Sema/SemaTemplate.cpp | 11 +++++++++-- ...dump-support-broken-external-resugarers.cpp | 18 ++++++++++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 clang/test/AST/ast-dump-support-broken-external-resugarers.cpp diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 54e689a7a42213..a4b323a922a6da 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -162,6 +162,7 @@ LANGOPT(CoroAlignedAllocation, 1, 0, "prefer Aligned Allocation according to P20 LANGOPT(DllExportInlines , 1, 1, "dllexported classes dllexport inline methods") LANGOPT(RelaxedTemplateTemplateArgs, 1, 1, "C++17 relaxed matching of template template arguments") LANGOPT(ExperimentalLibrary, 1, 0, "enable unstable and experimental library features") +LANGOPT(SupportBrokenExternalResugarers, 1, 0, "Suppress transforms which would impede broken external resugarers") LANGOPT(PointerAuthIntrinsics, 1, 0, "pointer authentication intrinsics") LANGOPT(PointerAuthCalls , 1, 0, "function pointer authentication") diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index e196c3dc5cb3be..551f975f2b15b3 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3449,6 +3449,11 @@ defm relaxed_template_template_args : BoolFOption<"relaxed-template-template-arg PosFlag<SetTrue, [], [], "Enable">, NegFlag<SetFalse, [], [CC1Option], "Disable">, BothFlags<[], [ClangOption], " C++17 relaxed template template argument matching">>; +defm support_broken_external_resugarers : BoolFOption<"support-broken-external-resugarers", + LangOpts<"SupportBrokenExternalResugarers">, DefaultFalse, + PosFlag<SetTrue, [], [CC1Option], "Enable">, + NegFlag<SetFalse, [], [], "Disable">, + BothFlags<[], [], " support for broken external resugarers">>; defm sized_deallocation : BoolFOption<"sized-deallocation", LangOpts<"SizedDeallocation">, Default<cpp14.KeyPath>, PosFlag<SetTrue, [], [], "Enable C++14 sized global deallocation functions">, diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index cd3ee31fcca610..7224d7cd892f30 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -3333,9 +3333,16 @@ QualType Sema::CheckTemplateIdType(TemplateName Name, return QualType(); // Only substitute for the innermost template argument list. + // NOTE: Some external resugarers rely on leaving a Subst* node here. + // Make the substituion non-final in that case. + // Note that these external resugarers are essentially broken + // for depending on this, because we don't provide + // enough context in the Subst* nodes in order + // to tell different template type alias specializations apart. MultiLevelTemplateArgumentList TemplateArgLists; - TemplateArgLists.addOuterTemplateArguments(Template, SugaredConverted, - /*Final=*/true); + TemplateArgLists.addOuterTemplateArguments( + Template, SugaredConverted, + /*Final=*/!getLangOpts().SupportBrokenExternalResugarers); TemplateArgLists.addOuterRetainedLevels( AliasTemplate->getTemplateParameters()->getDepth()); diff --git a/clang/test/AST/ast-dump-support-broken-external-resugarers.cpp b/clang/test/AST/ast-dump-support-broken-external-resugarers.cpp new file mode 100644 index 00000000000000..2f2e4ce16bcdd1 --- /dev/null +++ b/clang/test/AST/ast-dump-support-broken-external-resugarers.cpp @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -fsyntax-only -fsupport-broken-external-resugarers -ast-dump -ast-dump-filter=dump %s | FileCheck -strict-whitespace %s + +namespace t1 { +template<class T> using X = T; +using dump = X<int>; + +// CHECK-LABEL: Dumping t1::dump: +// CHECK-NEXT: TypeAliasDecl +// CHECK-NEXT: `-ElaboratedType +// CHECK-NEXT: `-TemplateSpecializationType +// CHECK-NEXT: |-name: 'X':'t1::X' qualified +// CHECK-NEXT: | `-TypeAliasTemplateDecl +// CHECK-NEXT: |-TemplateArgument +// CHECK-NEXT: | `-BuiltinType {{.+}} 'int' +// CHECK-NEXT: `-SubstTemplateTypeParmType 0x{{[0-9]+}} 'int' sugar class depth 0 index 0 T +// CHECK-NEXT: |-TypeAliasTemplate {{.+}} 'X' +// CHECK-NEXT: `-BuiltinType {{.+}} 'int' +} // namespace t1 >From 62663826f3506802329249fa927628d1a3b526aa Mon Sep 17 00:00:00 2001 From: Yitzhak Mandelbaum <yitzh...@google.com> Date: Tue, 13 Aug 2024 14:47:02 +0000 Subject: [PATCH 2/2] fixup! [clang] Add frontend flag to enable support for broken external resugarers rename flag and adjust the comments --- clang/include/clang/Basic/LangOptions.def | 2 +- clang/include/clang/Driver/Options.td | 7 ++++--- clang/lib/Sema/SemaTemplate.cpp | 15 +++++++-------- ...st-dump-support-broken-external-resugarers.cpp | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index a4b323a922a6da..dd205d9491edef 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -162,7 +162,7 @@ LANGOPT(CoroAlignedAllocation, 1, 0, "prefer Aligned Allocation according to P20 LANGOPT(DllExportInlines , 1, 1, "dllexported classes dllexport inline methods") LANGOPT(RelaxedTemplateTemplateArgs, 1, 1, "C++17 relaxed matching of template template arguments") LANGOPT(ExperimentalLibrary, 1, 0, "enable unstable and experimental library features") -LANGOPT(SupportBrokenExternalResugarers, 1, 0, "Suppress transforms which would impede broken external resugarers") +LANGOPT(RetainSubstTemplateTypeParmTypeAstNodes, 1, 0, "retain SubstTemplateTypeParmType nodes in the AST's representationof alias template specializations") LANGOPT(PointerAuthIntrinsics, 1, 0, "pointer authentication intrinsics") LANGOPT(PointerAuthCalls , 1, 0, "function pointer authentication") diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 551f975f2b15b3..b3bcd52cd00621 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3449,11 +3449,12 @@ defm relaxed_template_template_args : BoolFOption<"relaxed-template-template-arg PosFlag<SetTrue, [], [], "Enable">, NegFlag<SetFalse, [], [CC1Option], "Disable">, BothFlags<[], [ClangOption], " C++17 relaxed template template argument matching">>; -defm support_broken_external_resugarers : BoolFOption<"support-broken-external-resugarers", - LangOpts<"SupportBrokenExternalResugarers">, DefaultFalse, +defm retain_subst_template_type_parm_type_ast_nodes : BoolFOption<"retain-subst-template-type-parm-type-ast-nodes", + LangOpts<"RetainSubstTemplateTypeParmTypeAstNodes">, DefaultFalse, PosFlag<SetTrue, [], [CC1Option], "Enable">, NegFlag<SetFalse, [], [], "Disable">, - BothFlags<[], [], " support for broken external resugarers">>; + BothFlags<[], [], " retain SubstTemplateTypeParmType nodes in the AST's representation" + " of alias template specializations">>; defm sized_deallocation : BoolFOption<"sized-deallocation", LangOpts<"SizedDeallocation">, Default<cpp14.KeyPath>, PosFlag<SetTrue, [], [], "Enable C++14 sized global deallocation functions">, diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 7224d7cd892f30..1eaec04d345665 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -3332,17 +3332,16 @@ QualType Sema::CheckTemplateIdType(TemplateName Name, if (Pattern->isInvalidDecl()) return QualType(); - // Only substitute for the innermost template argument list. - // NOTE: Some external resugarers rely on leaving a Subst* node here. - // Make the substituion non-final in that case. - // Note that these external resugarers are essentially broken - // for depending on this, because we don't provide - // enough context in the Subst* nodes in order - // to tell different template type alias specializations apart. + // Only substitute for the innermost template argument list. NOTE: Some + // external resugarers rely on leaving a Subst* node here. Make the + // substitution non-final in that case. Note that these external resugarers + // will still miss some information in this representation, because we don't + // provide enough context in the Subst* nodes in order to tell different + // template type alias specializations apart. MultiLevelTemplateArgumentList TemplateArgLists; TemplateArgLists.addOuterTemplateArguments( Template, SugaredConverted, - /*Final=*/!getLangOpts().SupportBrokenExternalResugarers); + /*Final=*/!getLangOpts().RetainSubstTemplateTypeParmTypeAstNodes); TemplateArgLists.addOuterRetainedLevels( AliasTemplate->getTemplateParameters()->getDepth()); diff --git a/clang/test/AST/ast-dump-support-broken-external-resugarers.cpp b/clang/test/AST/ast-dump-support-broken-external-resugarers.cpp index 2f2e4ce16bcdd1..de1a1051a09933 100644 --- a/clang/test/AST/ast-dump-support-broken-external-resugarers.cpp +++ b/clang/test/AST/ast-dump-support-broken-external-resugarers.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -fsupport-broken-external-resugarers -ast-dump -ast-dump-filter=dump %s | FileCheck -strict-whitespace %s +// RUN: %clang_cc1 -fsyntax-only -fretain-subst-template-type-parm-type-ast-nodes -ast-dump -ast-dump-filter=dump %s | FileCheck -strict-whitespace %s namespace t1 { template<class T> using X = T; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits