You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

971 rivejä
26 KiB

================================================================================
Reflection operator
================================================================================
static_assert(std::meta::is_type(^^int()));
static_assert(std::meta::is_namespace(^^::));
template<bool> struct X {};
consteval bool operator<(std::meta::info, X<false>) { return false; }
consteval void g(std::meta::info r, X<false> xv) {
r == (^^int) && true;
(^^X) < xv;
^^X<true> < xv;
}
constexpr std::meta::info r1 = ^^A;
constexpr std::meta::info r2 = ^^B::C;
template <typename T> void fn() requires (^^T == ^^int);
constexpr std::meta::info a = ^^fn<char>;
constexpr std::meta::info b = ^^std::vector;
template <typename T>
struct S {
static constexpr std::meta::info r = ^^T;
using type = T;
};
static_assert(S<int>::r == ^^int);
static_assert(^^S<int>::type != ^^int);
constexpr T obj{.r=^^::};
constexpr std::meta::info yeti = ^^void(int) const &;
add_member(^^char const *);
--------------------------------------------------------------------------------
(translation_unit
(static_assert_declaration
(call_expression
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(identifier)))
(argument_list
(reflect_expression
(call_expression
(primitive_type)
(argument_list))))))
(static_assert_declaration
(call_expression
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(identifier)))
(argument_list
(reflect_expression))))
(template_declaration
(template_parameter_list
(parameter_declaration
(primitive_type)))
(struct_specifier
(type_identifier)
(field_declaration_list)))
(function_definition
(type_qualifier)
(primitive_type)
(function_declarator
(operator_name)
(parameter_list
(parameter_declaration
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(type_identifier))))
(parameter_declaration
(template_type
(type_identifier)
(template_argument_list
(false))))))
(compound_statement
(return_statement
(false))))
(function_definition
(type_qualifier)
(primitive_type)
(function_declarator
(identifier)
(parameter_list
(parameter_declaration
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(type_identifier)))
(identifier))
(parameter_declaration
(template_type
(type_identifier)
(template_argument_list
(false)))
(identifier))))
(compound_statement
(expression_statement
(binary_expression
(binary_expression
(identifier)
(parenthesized_expression
(reflect_expression
(type_descriptor
(primitive_type)))))
(true)))
(expression_statement
(binary_expression
(parenthesized_expression
(reflect_expression
(identifier)))
(identifier)))
(expression_statement
(binary_expression
(reflect_expression
(type_descriptor
(template_type
(type_identifier)
(template_argument_list
(true)))))
(identifier)))))
(declaration
(type_qualifier)
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(type_identifier)))
(init_declarator
(identifier)
(reflect_expression
(identifier))))
(declaration
(type_qualifier)
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(type_identifier)))
(init_declarator
(identifier)
(reflect_expression
(type_descriptor
(qualified_identifier
(namespace_identifier)
(type_identifier))))))
(template_declaration
(template_parameter_list
(type_parameter_declaration
(type_identifier)))
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list)
(requires_clause
(binary_expression
(reflect_expression
(type_descriptor
(type_identifier)))
(reflect_expression
(type_descriptor
(primitive_type))))))))
(declaration
(type_qualifier)
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(type_identifier)))
(init_declarator
(identifier)
(reflect_expression
(template_function
(identifier)
(template_argument_list
(type_descriptor
(primitive_type)))))))
(declaration
(type_qualifier)
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(type_identifier)))
(init_declarator
(identifier)
(reflect_expression
(type_descriptor
(qualified_identifier
(namespace_identifier)
(type_identifier))))))
(template_declaration
(template_parameter_list
(type_parameter_declaration
(type_identifier)))
(struct_specifier
(type_identifier)
(field_declaration_list
(field_declaration
(storage_class_specifier)
(type_qualifier)
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(type_identifier)))
(field_identifier)
(reflect_expression
(identifier)))
(alias_declaration
(type_identifier)
(type_descriptor
(type_identifier))))))
(static_assert_declaration
(binary_expression
(qualified_identifier
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(primitive_type))))
(identifier))
(reflect_expression
(type_descriptor
(primitive_type)))))
(static_assert_declaration
(binary_expression
(reflect_expression
(type_descriptor
(qualified_identifier
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(primitive_type))))
(type_identifier))))
(reflect_expression
(type_descriptor
(primitive_type)))))
(declaration
(type_qualifier)
(type_identifier)
(init_declarator
(identifier)
(initializer_list
(initializer_pair
(field_designator
(field_identifier))
(reflect_expression)))))
(declaration
(type_qualifier)
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(type_identifier)))
(init_declarator
(identifier)
(reflect_expression
(type_descriptor
(primitive_type)
(abstract_function_declarator
(parameter_list
(parameter_declaration
(primitive_type)))
(type_qualifier)
(ref_qualifier))))))
(expression_statement
(call_expression
(identifier)
(argument_list
(reflect_expression
(type_descriptor
(primitive_type)
(type_qualifier)
(abstract_pointer_declarator)))))))
================================================================================
Splice type specifiers and requirements
================================================================================
using alias = [:^^TCls:]<([:^^v:])>;
using enum [:^^Enum:];
using namespace [:^^:::];
namespace global = [:^^:::];
int o1 = [:^^S::x:];
auto o2 = typename [:^^TCls:]<([:^^v:])>();
int S::*k = &[:^^S::m:];
int v1 = [:^^TCls<1>:]::s;
int v2 = template [:^^TCls:]<2>::s;
typename [:^^TCls:]<3>::type v3 = 3;
template [:^^TCls:]<3>::type v4 = 4;
typename template [:^^TCls:]<3>::type v5 = 5;
template <typename T>
concept C = requires {
typename [:T::r1:];
typename [:T::r2:]<int>;
};
--------------------------------------------------------------------------------
(translation_unit
(alias_declaration
(type_identifier)
(type_descriptor
(splice_type_specifier
(splice_specifier
(reflect_expression
(identifier)))
(template_argument_list
(parenthesized_expression
(splice_expression
(splice_specifier
(reflect_expression
(identifier)))))))))
(using_declaration
(splice_type_specifier
(splice_specifier
(reflect_expression
(identifier)))))
(using_declaration
(splice_type_specifier
(splice_specifier
(reflect_expression))))
(namespace_alias_definition
(namespace_identifier)
(splice_specifier
(reflect_expression)))
(declaration
(primitive_type)
(init_declarator
(identifier)
(splice_expression
(splice_specifier
(reflect_expression
(type_descriptor
(qualified_identifier
(namespace_identifier)
(type_identifier))))))))
(declaration
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(call_expression
(splice_type_specifier
(splice_specifier
(reflect_expression
(identifier)))
(template_argument_list
(parenthesized_expression
(splice_expression
(splice_specifier
(reflect_expression
(identifier)))))))
(argument_list))))
(declaration
(primitive_type)
(init_declarator
(qualified_identifier
(namespace_identifier)
(pointer_type_declarator
(type_identifier)))
(pointer_expression
(splice_expression
(splice_specifier
(reflect_expression
(type_descriptor
(qualified_identifier
(namespace_identifier)
(type_identifier)))))))))
(declaration
(primitive_type)
(init_declarator
(identifier)
(qualified_identifier
(splice_type_specifier
(splice_specifier
(reflect_expression
(template_function
(identifier)
(template_argument_list
(number_literal))))))
(identifier))))
(declaration
(primitive_type)
(init_declarator
(identifier)
(qualified_identifier
(splice_expression
(splice_specifier
(reflect_expression
(identifier)))
(template_argument_list
(number_literal)))
(identifier))))
(declaration
(dependent_type
(qualified_identifier
(splice_type_specifier
(splice_specifier
(reflect_expression
(identifier)))
(template_argument_list
(number_literal)))
(type_identifier)))
(init_declarator
(identifier)
(number_literal)))
(declaration
(qualified_identifier
(splice_expression
(splice_specifier
(reflect_expression
(identifier)))
(template_argument_list
(number_literal)))
(type_identifier))
(init_declarator
(identifier)
(number_literal)))
(declaration
(dependent_type
(qualified_identifier
(splice_expression
(splice_specifier
(reflect_expression
(identifier)))
(template_argument_list
(number_literal)))
(type_identifier)))
(init_declarator
(identifier)
(number_literal)))
(template_declaration
(template_parameter_list
(type_parameter_declaration
(type_identifier)))
(concept_definition
(identifier)
(requires_expression
(requirement_seq
(type_requirement
(splice_type_specifier
(splice_specifier
(qualified_identifier
(namespace_identifier)
(identifier)))))
(simple_requirement)
(type_requirement
(splice_type_specifier
(splice_specifier
(qualified_identifier
(namespace_identifier)
(identifier)))
(template_argument_list
(type_descriptor
(primitive_type)))))
(simple_requirement))))))
================================================================================
Splice expressions
================================================================================
constexpr int c = [:^^S:]::a;
constexpr int d = template [:^^TCls:]<int>::b;
template <auto V> constexpr int e = [:V:];
constexpr int f = template [:^^e:]<^^S::a>;
constexpr auto g = typename [:^^int:](42);
constexpr auto h = typename [:^^int:]{42};
constexpr auto j = e<([:^^h:])>;
[:^^A::f:](3, 4);
T* p4 = template [:r:]<200>();
S<[:r:] + 1> s3;
template <auto T, auto NS>
void fn() {
using a = [:T:]<1>;
static_assert([:NS:]::template TCls<1>::v == a::v);
}
fn<^^N::TCls, ^^N>();
int v1 = base_.[:fields[I]:];
int v2 = base_->[:fields[I]:];
--------------------------------------------------------------------------------
(translation_unit
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(identifier)
(qualified_identifier
(splice_type_specifier
(splice_specifier
(reflect_expression
(identifier))))
(identifier))))
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(identifier)
(qualified_identifier
(splice_expression
(splice_specifier
(reflect_expression
(identifier)))
(template_argument_list
(type_descriptor
(primitive_type))))
(identifier))))
(template_declaration
(template_parameter_list
(parameter_declaration
(placeholder_type_specifier
(auto))
(identifier)))
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(identifier)
(splice_expression
(splice_specifier
(identifier))))))
(declaration
(type_qualifier)
(primitive_type)
(init_declarator
(identifier)
(splice_expression
(splice_specifier
(reflect_expression
(identifier)))
(template_argument_list
(reflect_expression
(type_descriptor
(qualified_identifier
(namespace_identifier)
(type_identifier))))))))
(declaration
(type_qualifier)
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(call_expression
(splice_type_specifier
(splice_specifier
(reflect_expression
(type_descriptor
(primitive_type)))))
(argument_list
(number_literal)))))
(declaration
(type_qualifier)
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(compound_literal_expression
(splice_type_specifier
(splice_specifier
(reflect_expression
(type_descriptor
(primitive_type)))))
(initializer_list
(number_literal)))))
(declaration
(type_qualifier)
(placeholder_type_specifier
(auto))
(init_declarator
(identifier)
(template_function
(identifier)
(template_argument_list
(parenthesized_expression
(splice_expression
(splice_specifier
(reflect_expression
(identifier)))))))))
(expression_statement
(call_expression
(splice_expression
(splice_specifier
(reflect_expression
(type_descriptor
(qualified_identifier
(namespace_identifier)
(type_identifier))))))
(argument_list
(number_literal)
(number_literal))))
(declaration
(type_identifier)
(init_declarator
(pointer_declarator
(identifier))
(call_expression
(splice_expression
(splice_specifier
(identifier))
(template_argument_list
(number_literal)))
(argument_list))))
(declaration
(template_type
(type_identifier)
(template_argument_list
(binary_expression
(splice_expression
(splice_specifier
(identifier)))
(number_literal))))
(identifier))
(template_declaration
(template_parameter_list
(parameter_declaration
(placeholder_type_specifier
(auto))
(identifier))
(parameter_declaration
(placeholder_type_specifier
(auto))
(identifier)))
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(alias_declaration
(type_identifier)
(type_descriptor
(splice_type_specifier
(splice_specifier
(identifier))
(template_argument_list
(number_literal)))))
(static_assert_declaration
(binary_expression
(binary_expression
(binary_expression
(qualified_identifier
(splice_type_specifier
(splice_specifier
(identifier)))
(identifier))
(number_literal))
(qualified_identifier
(identifier)))
(qualified_identifier
(namespace_identifier)
(identifier)))))))
(expression_statement
(call_expression
(template_function
(identifier)
(template_argument_list
(reflect_expression
(type_descriptor
(qualified_identifier
(namespace_identifier)
(type_identifier))))
(reflect_expression
(identifier))))
(argument_list)))
(declaration
(primitive_type)
(init_declarator
(identifier)
(field_expression
(identifier)
(splice_expression
(splice_specifier
(subscript_expression
(identifier)
(subscript_argument_list
(identifier))))))))
(declaration
(primitive_type)
(init_declarator
(identifier)
(field_expression
(identifier)
(splice_expression
(splice_specifier
(subscript_expression
(identifier)
(subscript_argument_list
(identifier)))))))))
================================================================================
Consteval blocks
================================================================================
class A {
struct A;
consteval {
std::meta::define_aggregate(^^S, {});
return;
}
};
template <std::meta::info R> consteval void tfn2() {
consteval { std::meta::define_aggregate(R, {}); }
}
template <typename> struct TCls {
static constexpr void sfn() requires ([] {
struct S4;
consteval { std::meta::define_aggregate(^^S4, {}); }
return true;
}()) { }
};
consteval { TCls<void>::sfn(); }
--------------------------------------------------------------------------------
(translation_unit
(class_specifier
(type_identifier)
(field_declaration_list
(field_declaration
(struct_specifier
(type_identifier)))
(consteval_block_declaration
(compound_statement
(expression_statement
(call_expression
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(identifier)))
(argument_list
(reflect_expression
(identifier))
(initializer_list))))
(return_statement)))))
(template_declaration
(template_parameter_list
(parameter_declaration
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(type_identifier)))
(identifier)))
(function_definition
(type_qualifier)
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(consteval_block_declaration
(compound_statement
(expression_statement
(call_expression
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(identifier)))
(argument_list
(identifier)
(initializer_list)))))))))
(template_declaration
(template_parameter_list
(type_parameter_declaration))
(struct_specifier
(type_identifier)
(field_declaration_list
(function_definition
(storage_class_specifier)
(type_qualifier)
(primitive_type)
(function_declarator
(field_identifier)
(parameter_list)
(requires_clause
(call_expression
(lambda_expression
(lambda_capture_specifier)
(compound_statement
(struct_specifier
(type_identifier))
(consteval_block_declaration
(compound_statement
(expression_statement
(call_expression
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(identifier)))
(argument_list
(reflect_expression
(identifier))
(initializer_list))))))
(return_statement
(true))))
(argument_list))))
(compound_statement)))))
(consteval_block_declaration
(compound_statement
(expression_statement
(call_expression
(qualified_identifier
(template_type
(type_identifier)
(template_argument_list
(type_descriptor
(primitive_type))))
(identifier))
(argument_list))))))
================================================================================
Annotations
================================================================================
[[=1]] void f();
[[=2, =3]] void g();
void g [[=4]] [[=2]] ();
template <class T>
[[=T::type()]] void f(T t);
struct Option { bool value; };
struct C {
[[=Option{true}]] int a;
[[=Option{false}]] int b;
};
--------------------------------------------------------------------------------
(translation_unit
(declaration
(attribute_declaration
(annotation
(number_literal)))
(primitive_type)
(function_declarator
(identifier)
(parameter_list)))
(declaration
(attribute_declaration
(annotation
(number_literal))
(annotation
(number_literal)))
(primitive_type)
(function_declarator
(identifier)
(parameter_list)))
(declaration
(primitive_type)
(function_declarator
(attributed_declarator
(identifier)
(attribute_declaration
(annotation
(number_literal)))
(attribute_declaration
(annotation
(number_literal))))
(parameter_list)))
(template_declaration
(template_parameter_list
(type_parameter_declaration
(type_identifier)))
(declaration
(attribute_declaration
(annotation
(call_expression
(qualified_identifier
(namespace_identifier)
(identifier))
(argument_list))))
(primitive_type)
(function_declarator
(identifier)
(parameter_list
(parameter_declaration
(type_identifier)
(identifier))))))
(struct_specifier
(type_identifier)
(field_declaration_list
(field_declaration
(primitive_type)
(field_identifier))))
(struct_specifier
(type_identifier)
(field_declaration_list
(field_declaration
(attribute_declaration
(annotation
(compound_literal_expression
(type_identifier)
(initializer_list
(true)))))
(primitive_type)
(field_identifier))
(field_declaration
(attribute_declaration
(annotation
(compound_literal_expression
(type_identifier)
(initializer_list
(false)))))
(primitive_type)
(field_identifier)))))
================================================================================
Expansion statements
================================================================================
template for (auto const& c : {Containers...}) {}
template for (constexpr int I : std::views::iota(0zu, sizeof...(Ts))) {}
--------------------------------------------------------------------------------
(translation_unit
(expansion_statement
(placeholder_type_specifier
(auto))
(type_qualifier)
(reference_declarator
(identifier))
(initializer_list
(parameter_pack_expansion
(identifier)))
(compound_statement))
(expansion_statement
(type_qualifier)
(primitive_type)
(identifier)
(call_expression
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(identifier)))
(argument_list
(number_literal)
(sizeof_expression
(identifier))))
(compound_statement)))