Handle StructuralValue-type template arguments in define_aggregate.
Fixes #159.
This commit is contained in:
@@ -551,8 +551,15 @@ public:
|
||||
SourceLocation());
|
||||
break;
|
||||
}
|
||||
// TODO(P2996): Handle other kinds of TemplateArgument
|
||||
// (e.g., structural).
|
||||
case TemplateArgument::StructuralValue: {
|
||||
Expr *E = new (S.Context) OpaqueValueExpr(
|
||||
DefinitionLoc, TArg.getStructuralValueType(), VK_PRValue);
|
||||
E = ConstantExpr::Create(S.Context, E, TArg.getAsStructuralValue());
|
||||
ParsedTArgs.emplace_back(ParsedTemplateArgument::NonType, E,
|
||||
SourceLocation());
|
||||
break;
|
||||
}
|
||||
// TODO(P2996): Handle other kinds of TemplateArgument.
|
||||
default:
|
||||
llvm_unreachable("unimplemented");
|
||||
}
|
||||
|
||||
@@ -396,4 +396,31 @@ int_holder_template<int_holder{0}> o2;
|
||||
|
||||
} // namespace bb_clang_p2996_issue_145_regression_test
|
||||
|
||||
// ========================================
|
||||
// bb_clang_p2996_issue_159_regression_test
|
||||
// ========================================
|
||||
|
||||
namespace bb_clang_p2996_issue_159_regression_test {
|
||||
template <auto V>
|
||||
struct VS;
|
||||
|
||||
template <>
|
||||
struct VS<^^float>{};
|
||||
|
||||
consteval {
|
||||
std::meta::define_aggregate(^^VS<0>, {});
|
||||
std::meta::define_aggregate(
|
||||
std::meta::substitute(^^VS, {std::meta::reflect_constant(1)}), {});
|
||||
|
||||
std::meta::define_aggregate(
|
||||
std::meta::substitute(^^VS, {std::meta::reflect_constant(^^int)}),
|
||||
{});
|
||||
}
|
||||
|
||||
VS<1> v1;
|
||||
VS<^^int> v2;
|
||||
|
||||
} // namespace bb_clang_p2996_issue_159_regression_test
|
||||
|
||||
|
||||
int main() { }
|
||||
|
||||
Reference in New Issue
Block a user