diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 8e5dbeb792348..1adb81ad358b7 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -4297,6 +4297,15 @@ class TreeTransform { return getSema().OpenACC().ActOnOpenACCAsteriskSizeExpr(AsteriskLoc); } + ExprResult + RebuildSubstNonTypeTemplateParmExpr(Decl *AssociatedDecl, + const NonTypeTemplateParmDecl *NTTP, + SourceLocation Loc, TemplateArgument Arg, + UnsignedOrNone PackIndex, bool Final) { + return getSema().BuildSubstNonTypeTemplateParmExpr( + AssociatedDecl, NTTP, Loc, Arg, PackIndex, Final); + } + private: QualType TransformTypeInObjectScope(TypeLocBuilder &TLB, TypeLoc TL, QualType ObjectType, @@ -16459,7 +16468,7 @@ ExprResult TreeTransform::TransformSubstNonTypeTemplateParmPackExpr( TemplateArgument Pack = E->getArgumentPack(); TemplateArgument Arg = SemaRef.getPackSubstitutedTemplateArgument(Pack); - return SemaRef.BuildSubstNonTypeTemplateParmExpr( + return getDerived().RebuildSubstNonTypeTemplateParmExpr( E->getAssociatedDecl(), E->getParameterPack(), E->getParameterPackLocation(), Arg, SemaRef.getPackIndex(Pack), E->getFinal()); @@ -16517,10 +16526,10 @@ ExprResult TreeTransform::TransformSubstNonTypeTemplateParmExpr( Replacement = E->getReplacement(); } - return new (SemaRef.Context) SubstNonTypeTemplateParmExpr( - Replacement.get()->getType(), Replacement.get()->getValueKind(), - E->getNameLoc(), Replacement.get(), AssociatedDecl, E->getIndex(), - E->getPackIndex(), E->isReferenceParameter(), E->getFinal()); + return getDerived().RebuildSubstNonTypeTemplateParmExpr( + AssociatedDecl, E->getParameter(), E->getNameLoc(), + TemplateArgument(Replacement.get(), /*IsCanonical=*/false), + E->getPackIndex(), E->getFinal()); } template diff --git a/clang/test/SemaTemplate/concepts.cpp b/clang/test/SemaTemplate/concepts.cpp index c90af41a09468..eed8b786f9954 100644 --- a/clang/test/SemaTemplate/concepts.cpp +++ b/clang/test/SemaTemplate/concepts.cpp @@ -1658,3 +1658,48 @@ struct { void foo() { call(""); } } + +namespace GH170856 { + +template struct symbol_text { + consteval symbol_text(const char txt[]) {} +}; +template symbol_text(const char (&)[N]) -> symbol_text<1, 1>; +struct quantity_spec_interface_base {}; +template struct named_unit; +struct quantity_spec_interface : quantity_spec_interface_base {}; +struct : quantity_spec_interface { +} thermodynamic_temperature; + +template +concept QuantitySpec = __is_convertible(T*, quantity_spec_interface_base*); +template +concept QuantitySpecOf = QuantitySpec; +template +concept PointOriginFor = QuantitySpecOf; + +template +struct named_unit { + static constexpr auto _point_origin_ = PO; +}; +template struct absolute_point_origin { + static constexpr auto _quantity_spec_ = QS; +}; +template struct relative_point_origin {}; +template +consteval PointOriginFor auto default_point_origin(R) { + return R{}._point_origin_; +} +template class quantity_point; +template struct point_ { + quantity_point operator0(); +}; +template point_ point; +struct absolute_zero : absolute_point_origin { +} absolute_zero; +auto zeroth_kelvin = absolute_zero; +struct : named_unit<"", thermodynamic_temperature, zeroth_kelvin> { +} kelvin; +struct ice_point : relative_point_origin> {}; + +}