Files
carbon-lang/toolchain/check/testdata/interop/cpp/modules.carbon
T
Richard SmithandJon Ross-Perkins a8eca2ece6 Delay finishing the C++ translation unit until we reach the real EOF. (#6489)
Instead of parsing a complete C++ translation unit and then interacting
with the translation unit further after the fact, delay finishing the
translation unit until we finish the Carbon check phase. This fixes some
issues where we would produce duplicated or incorrect diagnostics at the
end of the C++ translation unit, particularly for unused declarations.
Now we're in control of how we parse the translation unit, also disable
parsing of C++20 modules if the syntax appears within `import Cpp
inline` code.

Keep the same clang parser alive throughout check, and use it instead of
building a new one when parsing macros. This resolves issues where the
translation unit scope was destroyed too early, resulting in unqualified
lookup within macros being unable to find global scope entities.

---------

Co-authored-by: Jon Ross-Perkins <jperkins@google.com>
2025-12-13 00:56:30 +00:00

90 lines
3.7 KiB
Plaintext

// 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
//
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/none.carbon
// EXTRA-ARGS: --clang-arg=--std=c++20
//
// AUTOUPDATE
// TIP: To test this file alone, run:
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/interop/cpp/modules.carbon
// TIP: To dump output, run:
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interop/cpp/modules.carbon
// --- fail_export_module_in_inline_cpp.carbon
library "[[@TEST_NAME]]";
// TODO: This diagnostic isn't very good.
import Cpp inline '''
// CHECK:STDERR: fail_export_module_in_inline_cpp.carbon:[[@LINE+7]]:8: error: module declaration must occur at the start of the translation unit [CppInteropParseError]
// CHECK:STDERR: 13 | export module Foo;
// CHECK:STDERR: | ^
// CHECK:STDERR: <carbon Cpp imports>:1:1: note: add 'module;' to the start of the file to introduce a global module fragment [CppInteropParseNote]
// CHECK:STDERR: 1 | # 6 "fail_export_module_in_inline_cpp.carbon"
// CHECK:STDERR: | ^
// CHECK:STDERR:
export module Foo;
''';
// --- fail_module_in_inline_cpp.carbon
library "[[@TEST_NAME]]";
// TODO: This diagnostic isn't very good.
import Cpp inline '''
// CHECK:STDERR: fail_module_in_inline_cpp.carbon:[[@LINE+11]]:1: error: module declaration must occur at the start of the translation unit [CppInteropParseError]
// CHECK:STDERR: 17 | module Foo;
// CHECK:STDERR: | ^
// CHECK:STDERR: <carbon Cpp imports>:1:1: note: add 'module;' to the start of the file to introduce a global module fragment [CppInteropParseNote]
// CHECK:STDERR: 1 | # 6 "fail_module_in_inline_cpp.carbon"
// CHECK:STDERR: | ^
// CHECK:STDERR:
// CHECK:STDERR: fail_module_in_inline_cpp.carbon:[[@LINE+4]]:8: error: module 'Foo' not found [CppInteropParseError]
// CHECK:STDERR: 17 | module Foo;
// CHECK:STDERR: | ~~~~~~~^~~
// CHECK:STDERR:
module Foo;
''';
// --- fail_global_module_in_inline_cpp.carbon
library "[[@TEST_NAME]]";
// TODO: This diagnostic isn't very good.
import Cpp inline '''
// CHECK:STDERR: fail_global_module_in_inline_cpp.carbon:[[@LINE+4]]:1: error: 'module;' introducing a global module fragment can appear only at the start of the translation unit [CppInteropParseError]
// CHECK:STDERR: 10 | module;
// CHECK:STDERR: | ^~~~~~~
// CHECK:STDERR:
module;
int n;
// CHECK:STDERR: fail_global_module_in_inline_cpp.carbon:[[@LINE+11]]:1: error: module declaration must occur at the start of the translation unit [CppInteropParseError]
// CHECK:STDERR: 25 | module Foo;
// CHECK:STDERR: | ^
// CHECK:STDERR: <carbon Cpp imports>:1:1: note: add 'module;' to the start of the file to introduce a global module fragment [CppInteropParseNote]
// CHECK:STDERR: 1 | # 6 "fail_global_module_in_inline_cpp.carbon"
// CHECK:STDERR: | ^
// CHECK:STDERR:
// CHECK:STDERR: fail_global_module_in_inline_cpp.carbon:[[@LINE+4]]:8: error: module 'Foo' not found [CppInteropParseError]
// CHECK:STDERR: 25 | module Foo;
// CHECK:STDERR: | ~~~~~~~^~~
// CHECK:STDERR:
module Foo;
''';
// --- fail_import_in_inline_cpp.carbon
library "[[@TEST_NAME]]";
// TODO: Also test that a valid module import works.
import Cpp inline '''
// CHECK:STDERR: fail_import_in_inline_cpp.carbon:[[@LINE+4]]:8: error: 'file_that_does_not_exist.h' file not found [CppInteropParseError]
// CHECK:STDERR: 10 | import "file_that_does_not_exist.h";
// CHECK:STDERR: | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
import "file_that_does_not_exist.h";
''';