From 28d6aedbbb61e9c07ea32fc69730a7c6db567fed Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Wed, 15 Jan 2025 22:27:58 +0100 Subject: [PATCH] Add Support for #include in cpp files imported from Carbon (#4809) Propagate `FileSystem` to `buildASTFromCodeWithArgs`(). Part of #4666 --- toolchain/check/check_unit.cpp | 2 +- toolchain/check/import_cpp.cpp | 7 +++-- toolchain/check/import_cpp.h | 5 ++-- .../interop/cpp/no_prelude/include.carbon | 30 +++++++++++++++++++ 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 toolchain/check/testdata/interop/cpp/no_prelude/include.carbon diff --git a/toolchain/check/check_unit.cpp b/toolchain/check/check_unit.cpp index 1005b32bc640..3eaa9efe6973 100644 --- a/toolchain/check/check_unit.cpp +++ b/toolchain/check/check_unit.cpp @@ -358,7 +358,7 @@ auto CheckUnit::ImportCppPackages() -> void { return; } - ImportCppFile(context_, import.node_id, source_buffer->filename(), + ImportCppFile(context_, import.node_id, fs_, source_buffer->filename(), source_buffer->text()); } diff --git a/toolchain/check/import_cpp.cpp b/toolchain/check/import_cpp.cpp index 9a9204346129..fd4cf37cc074 100644 --- a/toolchain/check/import_cpp.cpp +++ b/toolchain/check/import_cpp.cpp @@ -19,8 +19,9 @@ namespace Carbon::Check { -auto ImportCppFile(Context& context, SemIRLoc loc, llvm::StringRef file_path, - llvm::StringRef code) -> void { +auto ImportCppFile(Context& context, SemIRLoc loc, + llvm::IntrusiveRefCntPtr fs, + llvm::StringRef file_path, llvm::StringRef code) -> void { std::string diagnostics_str; llvm::raw_string_ostream diagnostics_stream(diagnostics_str); @@ -33,7 +34,7 @@ auto ImportCppFile(Context& context, SemIRLoc loc, llvm::StringRef file_path, code, {}, file_path, "clang-tool", std::make_shared(), clang::tooling::getClangStripDependencyFileAdjuster(), - clang::tooling::FileContentMappings(), &diagnostics_consumer); + clang::tooling::FileContentMappings(), &diagnostics_consumer, fs); // TODO: Implement and use a DynamicRecursiveASTVisitor to traverse the AST. int num_errors = diagnostics_consumer.getNumErrors(); int num_warnings = diagnostics_consumer.getNumWarnings(); diff --git a/toolchain/check/import_cpp.h b/toolchain/check/import_cpp.h index 10a380d2994e..a3fbfcca5687 100644 --- a/toolchain/check/import_cpp.h +++ b/toolchain/check/import_cpp.h @@ -12,8 +12,9 @@ namespace Carbon::Check { // Parses the C++ code and report errors and warnings. -auto ImportCppFile(Context& context, SemIRLoc loc, llvm::StringRef file_path, - llvm::StringRef code) -> void; +auto ImportCppFile(Context& context, SemIRLoc loc, + llvm::IntrusiveRefCntPtr fs, + llvm::StringRef file_path, llvm::StringRef code) -> void; } // namespace Carbon::Check diff --git a/toolchain/check/testdata/interop/cpp/no_prelude/include.carbon b/toolchain/check/testdata/interop/cpp/no_prelude/include.carbon new file mode 100644 index 000000000000..58bfb3d68121 --- /dev/null +++ b/toolchain/check/testdata/interop/cpp/no_prelude/include.carbon @@ -0,0 +1,30 @@ +// 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/check/testdata/interop/cpp/no_prelude/include.carbon +// TIP: To dump output, run: +// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interop/cpp/no_prelude/include.carbon + +// --- included_file.h + +void foo(); + +// --- including_file.h + +#include "included_file.h" + +// --- import_function_decl.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "including_file.h"; + +// CHECK:STDOUT: --- import_function_decl.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [template] {} +// CHECK:STDOUT: } +// CHECK:STDOUT: