Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 

654 wiersze
18 KiB

================================================================================
Returning braced initializer lists
================================================================================
T main() {
return {0, 5};
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(type_identifier)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(return_statement
(initializer_list
(number_literal)
(number_literal))))))
================================================================================
Range-based for loops
================================================================================
T main() {
for (Value &value : values) {
cout << value;
}
for (const auto &value : values) {
cout << value;
}
for (const auto &value : {1, 2, 3}) {
cout << value;
}
for (auto n = v.size(); auto i : v) {
cout << --n + i << ' ';
}
for (using elem_t = T::value_type; elem_t i : v) {
cout << --n + i << ' ';
}
for (int x; int v : {1}) {}
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
type: (type_identifier)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list))
body: (compound_statement
(for_range_loop
type: (type_identifier)
declarator: (reference_declarator
(identifier))
right: (identifier)
body: (compound_statement
(expression_statement
(binary_expression
left: (identifier)
right: (identifier)))))
(for_range_loop
(type_qualifier)
type: (placeholder_type_specifier
(auto))
declarator: (reference_declarator
(identifier))
right: (identifier)
body: (compound_statement
(expression_statement
(binary_expression
left: (identifier)
right: (identifier)))))
(for_range_loop
(type_qualifier)
type: (placeholder_type_specifier
(auto))
declarator: (reference_declarator
(identifier))
right: (initializer_list
(number_literal)
(number_literal)
(number_literal))
body: (compound_statement
(expression_statement
(binary_expression
left: (identifier)
right: (identifier)))))
(for_range_loop
initializer: (init_statement
(declaration
type: (placeholder_type_specifier
(auto))
declarator: (init_declarator
declarator: (identifier)
value: (call_expression
function: (field_expression
argument: (identifier)
field: (field_identifier))
arguments: (argument_list)))))
type: (placeholder_type_specifier
(auto))
declarator: (identifier)
right: (identifier)
body: (compound_statement
(expression_statement
(binary_expression
left: (binary_expression
left: (identifier)
right: (binary_expression
left: (update_expression
argument: (identifier))
right: (identifier)))
right: (char_literal
(character))))))
(for_range_loop
initializer: (init_statement
(alias_declaration
name: (type_identifier)
type: (type_descriptor
type: (qualified_identifier
scope: (namespace_identifier)
name: (type_identifier)))))
type: (type_identifier)
declarator: (identifier)
right: (identifier)
body: (compound_statement
(expression_statement
(binary_expression
left: (binary_expression
left: (identifier)
right: (binary_expression
left: (update_expression
argument: (identifier))
right: (identifier)))
right: (char_literal
(character))))))
(for_range_loop
initializer: (init_statement
(declaration
type: (primitive_type)
declarator: (identifier)))
type: (primitive_type)
declarator: (identifier)
right: (initializer_list
(number_literal))
body: (compound_statement)))))
================================================================================
Constexpr if statements
================================================================================
T f() {
if constexpr (std::is_pointer_v<T>)
return *t;
else
return t;
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
type: (type_identifier)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list))
body: (compound_statement
(if_statement
condition: (condition_clause
value: (qualified_identifier
scope: (namespace_identifier)
name: (template_function
name: (identifier)
arguments: (template_argument_list
(type_descriptor
type: (type_identifier))))))
consequence: (return_statement
(pointer_expression
argument: (identifier)))
alternative: (else_clause
(return_statement
(identifier)))))))
================================================================================
If statements with declarations
================================================================================
void f() {
if (const int x = foo()) { }
if (const int x { foo() }) { }
if (const int x = foo(); x != 0) { }
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
type: (primitive_type)
declarator: (function_declarator
declarator: (identifier)
parameters: (parameter_list))
body: (compound_statement
(if_statement
condition: (condition_clause
value: (declaration
(type_qualifier)
type: (primitive_type)
declarator: (identifier)
value: (call_expression
function: (identifier)
arguments: (argument_list))))
consequence: (compound_statement))
(if_statement
condition: (condition_clause
value: (declaration
(type_qualifier)
type: (primitive_type)
declarator: (identifier)
value: (initializer_list
(call_expression
function: (identifier)
arguments: (argument_list)))))
consequence: (compound_statement))
(if_statement
condition: (condition_clause
initializer: (init_statement
(declaration
(type_qualifier)
type: (primitive_type)
declarator: (init_declarator
declarator: (identifier)
value: (call_expression
function: (identifier)
arguments: (argument_list)))))
value: (binary_expression
left: (identifier)
right: (number_literal)))
consequence: (compound_statement)))))
================================================================================
Try/catch statements
================================================================================
void main() {
try {
f();
} catch (const std::overflow_error) {
// f() throws std::overflow_error (same type rule)
} catch (const exception &e) {
// f() throws std::logic_error (base class rule)
} catch (...) {
// f() throws std::string or int or any other unrelated type
}
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(try_statement
(compound_statement
(expression_statement
(call_expression
(identifier)
(argument_list))))
(catch_clause
(parameter_list
(parameter_declaration
(type_qualifier)
(qualified_identifier
(namespace_identifier)
(type_identifier))))
(compound_statement
(comment)))
(catch_clause
(parameter_list
(parameter_declaration
(type_qualifier)
(type_identifier)
(reference_declarator
(identifier))))
(compound_statement
(comment)))
(catch_clause
(parameter_list)
(compound_statement
(comment)))))))
================================================================================
Throw statements
================================================================================
void main() {
throw e;
throw x + 1;
throw "exception";
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(throw_statement
(identifier))
(throw_statement
(binary_expression
(identifier)
(number_literal)))
(throw_statement
(string_literal
(string_content))))))
================================================================================
Noexcept specifier
================================================================================
void foo() noexcept;
void foo() noexcept(true);
template<class T> T foo() noexcept(sizeof(T) < 4);
--------------------------------------------------------------------------------
(translation_unit
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list)
(noexcept)))
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list)
(noexcept
(true))))
(template_declaration
(template_parameter_list
(type_parameter_declaration
(type_identifier)))
(declaration
(type_identifier)
(function_declarator
(identifier)
(parameter_list)
(noexcept
(binary_expression
(sizeof_expression
(parenthesized_expression
(identifier)))
(number_literal)))))))
================================================================================
Throw specifier
================================================================================
void foo() throw();
void foo() throw(int);
void foo() throw(std::string, char *);
void foo() throw(float) { }
--------------------------------------------------------------------------------
(translation_unit
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list)
(throw_specifier)))
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list)
(throw_specifier
(type_descriptor
(primitive_type)))))
(declaration
(primitive_type)
(function_declarator
(identifier)
(parameter_list)
(throw_specifier
(type_descriptor
(qualified_identifier
(namespace_identifier)
(type_identifier)))
(type_descriptor
(primitive_type)
(abstract_pointer_declarator)))))
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list)
(throw_specifier
(type_descriptor
(primitive_type))))
(compound_statement)))
================================================================================
Assignment
================================================================================
a::b::c = 1;
--------------------------------------------------------------------------------
(translation_unit
(expression_statement
(assignment_expression
(qualified_identifier
(namespace_identifier)
(qualified_identifier
(namespace_identifier)
(identifier)))
(number_literal))))
================================================================================
Attributes
================================================================================
void f() {
[[a]] switch (b) {
[[c]] case 1: {}
}
[[a]] while (true) {}
[[a]] if (true) {}
[[a]] for (auto x : y) {}
[[a]] for (;;) {}
[[a]] return;
[[a]] a;
[[a]];
[[a]] label: {}
[[a]] goto label;
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(switch_statement
(condition_clause
(identifier))
(compound_statement
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(case_statement
(number_literal)
(compound_statement))))))
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(while_statement
(condition_clause
(true))
(compound_statement)))
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(if_statement
(condition_clause
(true))
(compound_statement)))
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(for_range_loop
(placeholder_type_specifier
(auto))
(identifier)
(identifier)
(compound_statement)))
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(for_statement
(compound_statement)))
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(return_statement))
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(expression_statement
(identifier)))
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(expression_statement))
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(labeled_statement
(statement_identifier)
(compound_statement)))
(attributed_statement
(attribute_declaration
(attribute
(identifier)))
(goto_statement
(statement_identifier))))))
================================================================================
Coroutines
================================================================================
co_return 1;
co_return;
co_yield 1;
--------------------------------------------------------------------------------
(translation_unit
(co_return_statement
(number_literal))
(co_return_statement)
(co_yield_statement
(number_literal)))
================================================================================
Switch statements
================================================================================
void foo(int a) {
switch (a) {
case 1:
for (auto i : vec) {}
case 2:
try {
// do something
} catch(...) {}
throw 1;
case 3:
co_return;
default:
co_yield a;
}
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list
(parameter_declaration
(primitive_type)
(identifier))))
(compound_statement
(switch_statement
(condition_clause
(identifier))
(compound_statement
(case_statement
(number_literal)
(for_range_loop
(placeholder_type_specifier
(auto))
(identifier)
(identifier)
(compound_statement)))
(case_statement
(number_literal)
(try_statement
(compound_statement
(comment))
(catch_clause
(parameter_list)
(compound_statement)))
(throw_statement
(number_literal)))
(case_statement
(number_literal)
(co_return_statement))
(case_statement
(co_yield_statement
(identifier))))))))
================================================================================
Explicit calls to overloaded operators
================================================================================
void foo() {
obj.operator->("arg");
obj.operator==(4);
}
--------------------------------------------------------------------------------
(translation_unit
(function_definition
(primitive_type)
(function_declarator
(identifier)
(parameter_list))
(compound_statement
(expression_statement
(call_expression
(field_expression
(identifier)
(operator_name))
(argument_list
(string_literal
(string_content)))))
(expression_statement
(call_expression
(field_expression
(identifier)
(operator_name))
(argument_list
(number_literal)))))))