From 435ee44e4c79124a93941269e4784df19c201df0 Mon Sep 17 00:00:00 2001 From: Brymer Meneses <68867487+brymer-meneses@users.noreply.github.com> Date: Fri, 23 Aug 2024 00:21:46 +0800 Subject: [PATCH] Report invalid parse on `var x: i32 = {.7 = 8}` (#4237) --- toolchain/parse/handle_period.cpp | 3 +- .../fail_invalid_struct_designator.carbon | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 toolchain/parse/testdata/struct/fail_invalid_struct_designator.carbon diff --git a/toolchain/parse/handle_period.cpp b/toolchain/parse/handle_period.cpp index 8ececd7d35cbd..7675a8b0e720b 100644 --- a/toolchain/parse/handle_period.cpp +++ b/toolchain/parse/handle_period.cpp @@ -24,7 +24,8 @@ static auto HandlePeriodOrArrow(Context& context, NodeKind node_kind, } else if (context.ConsumeAndAddLeafNodeIf(Lex::TokenKind::Base, NodeKind::BaseName)) { // OK, `.base`. - } else if (context.ConsumeAndAddLeafNodeIf(Lex::TokenKind::IntLiteral, + } else if (node_kind != NodeKind::StructFieldDesignator && + context.ConsumeAndAddLeafNodeIf(Lex::TokenKind::IntLiteral, NodeKind::IntLiteral)) { // OK, '.42'. } else if (paren_state != State::Invalid && diff --git a/toolchain/parse/testdata/struct/fail_invalid_struct_designator.carbon b/toolchain/parse/testdata/struct/fail_invalid_struct_designator.carbon new file mode 100644 index 0000000000000..c2c5c6a3cd8ea --- /dev/null +++ b/toolchain/parse/testdata/struct/fail_invalid_struct_designator.carbon @@ -0,0 +1,32 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +// AUTOUPDATE +// TIP: To test this file alone, run: +// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/parse/testdata/struct/fail_invalid_struct_designator.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/parse/testdata/struct/fail_invalid_struct_designator.carbon + +// CHECK:STDERR: fail_invalid_struct_designator.carbon:[[@LINE+3]]:16: ERROR: Expected identifier after `.`. +// CHECK:STDERR: var x: i32 = {.7 = 8}; +// CHECK:STDERR: ^ +var x: i32 = {.7 = 8}; + +// CHECK:STDOUT: - filename: fail_invalid_struct_designator.carbon +// CHECK:STDOUT: parse_tree: [ +// CHECK:STDOUT: {kind: 'FileStart', text: ''}, +// CHECK:STDOUT: {kind: 'VariableIntroducer', text: 'var'}, +// CHECK:STDOUT: {kind: 'IdentifierName', text: 'x'}, +// CHECK:STDOUT: {kind: 'IntTypeLiteral', text: 'i32'}, +// CHECK:STDOUT: {kind: 'BindingPattern', text: ':', subtree_size: 3}, +// CHECK:STDOUT: {kind: 'VariableInitializer', text: '='}, +// CHECK:STDOUT: {kind: 'StructLiteralStart', text: '{'}, +// CHECK:STDOUT: {kind: 'IdentifierName', text: '7', has_error: yes}, +// CHECK:STDOUT: {kind: 'StructFieldDesignator', text: '.', subtree_size: 2}, +// CHECK:STDOUT: {kind: 'IntLiteral', text: '8'}, +// CHECK:STDOUT: {kind: 'InvalidParse', text: '=', has_error: yes}, +// CHECK:STDOUT: {kind: 'StructLiteral', text: '}', has_error: yes, subtree_size: 6}, +// CHECK:STDOUT: {kind: 'VariableDecl', text: ';', subtree_size: 12}, +// CHECK:STDOUT: {kind: 'FileEnd', text: ''}, +// CHECK:STDOUT: ]