@@ -721,7 +721,7 @@ struct postfix_expression_node
721
721
if (ops.empty ()) {
722
722
return false ;
723
723
} else {
724
- return (ops.front ().op ->type () == lexeme::Ampersand
724
+ return (ops.front ().op ->type () == lexeme::Ampersand
725
725
|| ops.front ().op ->type () == lexeme::Tilde);
726
726
}
727
727
}
@@ -3965,7 +3965,7 @@ class parser
3965
3965
// || curr().type() == lexeme::LeftBrace
3966
3966
)
3967
3967
{
3968
- bool inside_initializer = (
3968
+ bool inside_initializer = (
3969
3969
peek (-1 ) && peek (-1 )->type () == lexeme::Assignment
3970
3970
);
3971
3971
auto open_paren = &curr ();
@@ -3987,12 +3987,12 @@ class parser
3987
3987
next ();
3988
3988
if (
3989
3989
curr ().type () != lexeme::Semicolon
3990
- && curr ().type () != lexeme::RightParen
3991
- && curr ().type () != lexeme::RightBracket
3990
+ && curr ().type () != lexeme::RightParen
3991
+ && curr ().type () != lexeme::RightBracket
3992
3992
&& curr ().type () != lexeme::Comma
3993
3993
) {
3994
3994
expr_list->inside_initializer = false ;
3995
- }
3995
+ }
3996
3996
n->expr = std::move (expr_list);
3997
3997
return n;
3998
3998
}
@@ -4350,7 +4350,7 @@ class parser
4350
4350
// G shift-expression '<<' additive-expression
4351
4351
// G shift-expression '>>' additive-expression
4352
4352
// G
4353
- auto shift_expression (bool allow_angle_operators = true )
4353
+ auto shift_expression (bool allow_angle_operators = true )
4354
4354
-> auto
4355
4355
{
4356
4356
if (allow_angle_operators) {
@@ -4385,7 +4385,7 @@ class parser
4385
4385
// G shift-expression
4386
4386
// G compare-expression '<=>' shift-expression
4387
4387
// G
4388
- auto compare_expression (bool allow_angle_operators = true )
4388
+ auto compare_expression (bool allow_angle_operators = true )
4389
4389
-> auto
4390
4390
{
4391
4391
return binary_expression<compare_expression_node> (
@@ -4401,7 +4401,7 @@ class parser
4401
4401
// G relational-expression '<=' compare-expression
4402
4402
// G relational-expression '>=' compare-expression
4403
4403
// G
4404
- auto relational_expression (bool allow_angle_operators = true )
4404
+ auto relational_expression (bool allow_angle_operators = true )
4405
4405
-> auto
4406
4406
{
4407
4407
if (allow_angle_operators) {
@@ -4433,7 +4433,7 @@ class parser
4433
4433
// G equality-expression '==' relational-expression
4434
4434
// G equality-expression '!=' relational-expression
4435
4435
// G
4436
- auto equality_expression (bool allow_angle_operators = true )
4436
+ auto equality_expression (bool allow_angle_operators = true )
4437
4437
-> auto
4438
4438
{
4439
4439
return binary_expression<equality_expression_node> (
@@ -4446,7 +4446,7 @@ class parser
4446
4446
// G equality-expression
4447
4447
// G bit-and-expression '&' equality-expression
4448
4448
// G
4449
- auto bit_and_expression (bool allow_angle_operators = true )
4449
+ auto bit_and_expression (bool allow_angle_operators = true )
4450
4450
-> auto
4451
4451
{
4452
4452
return binary_expression<bit_and_expression_node> (
@@ -4459,7 +4459,7 @@ class parser
4459
4459
// G bit-and-expression
4460
4460
// G bit-xor-expression '^' bit-and-expression
4461
4461
// G
4462
- auto bit_xor_expression (bool allow_angle_operators = true )
4462
+ auto bit_xor_expression (bool allow_angle_operators = true )
4463
4463
-> auto
4464
4464
{
4465
4465
return binary_expression<bit_xor_expression_node> (
@@ -4472,7 +4472,7 @@ class parser
4472
4472
// G bit-xor-expression
4473
4473
// G bit-or-expression '|' bit-xor-expression
4474
4474
// G
4475
- auto bit_or_expression (bool allow_angle_operators = true )
4475
+ auto bit_or_expression (bool allow_angle_operators = true )
4476
4476
-> auto
4477
4477
{
4478
4478
return binary_expression<bit_or_expression_node> (
@@ -4485,7 +4485,7 @@ class parser
4485
4485
// G bit-or-expression
4486
4486
// G logical-and-expression '&&' bit-or-expression
4487
4487
// G
4488
- auto logical_and_expression (bool allow_angle_operators = true )
4488
+ auto logical_and_expression (bool allow_angle_operators = true )
4489
4489
-> auto
4490
4490
{
4491
4491
return binary_expression<logical_and_expression_node> (
@@ -4500,7 +4500,7 @@ class parser
4500
4500
// G logical-and-expression
4501
4501
// G logical-or-expression '||' logical-and-expression
4502
4502
// G
4503
- auto logical_or_expression (bool allow_angle_operators = true )
4503
+ auto logical_or_expression (bool allow_angle_operators = true )
4504
4504
-> auto
4505
4505
{
4506
4506
return binary_expression<logical_or_expression_node> (
@@ -4818,12 +4818,22 @@ class parser
4818
4818
4819
4819
n->open_angle = curr ().position ();
4820
4820
next ();
4821
-
4821
+
4822
4822
auto term = unqualified_id_node::term{};
4823
4823
4824
4824
do {
4825
- // disallow unparenthesized relational comparisons in template args
4826
- if (auto e = expression (false )) {
4825
+ if (auto e = [&]() {
4826
+ // If the template-argument can only be a type id
4827
+ // skip the expression production, because it start with
4828
+ if (
4829
+ curr ().type () == lexeme::Multiply // '*'
4830
+ || curr () == " const" // 'const'
4831
+ ) {
4832
+ return decltype (expression ()){};
4833
+ }
4834
+ // disallow unparenthesized relational comparisons in template args
4835
+ return expression (false );
4836
+ }()) {
4827
4837
term.arg = std::move (e);
4828
4838
}
4829
4839
else if (auto i = type_id ()) {
@@ -6389,7 +6399,7 @@ class parser
6389
6399
}
6390
6400
assert (n->is_type ());
6391
6401
}
6392
-
6402
+
6393
6403
// Or a function type, declaring a function - and tell the function whether it's in a user-defined type
6394
6404
else if (auto t = function_type (n.get (), named))
6395
6405
{
@@ -6537,11 +6547,11 @@ class parser
6537
6547
)
6538
6548
{
6539
6549
auto & type = std::get<declaration_node::an_object>(n->type );
6540
- // object initialized by the address of the curr() object
6550
+ // object initialized by the address of the curr() object
6541
6551
if (peek (1 )->type () == lexeme::Ampersand) {
6542
6552
type->address_of = &curr ();
6543
6553
}
6544
- // object initialized by (potentially multiple) dereference of the curr() object
6554
+ // object initialized by (potentially multiple) dereference of the curr() object
6545
6555
else if (peek (1 )->type () == lexeme::Multiply) {
6546
6556
type->dereference_of = &curr ();
6547
6557
for (int i = 1 ; peek (i)->type () == lexeme::Multiply; ++i)
@@ -6746,7 +6756,7 @@ class parser
6746
6756
return {};
6747
6757
}
6748
6758
if (
6749
- t->is_wildcard ()
6759
+ t->is_wildcard ()
6750
6760
|| ( t->get_token () && t->get_token ()->to_string (true ) == " auto" )
6751
6761
) {
6752
6762
errors.emplace_back (
0 commit comments