mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
Carbon currently requires a comment to be the only non-whitespace on its line. A `//` comment that follows other content on a line, called a _trailing comment_, is a lexer error. This proposal removes that restriction, allowing a comment to follow other content on a line. Everything else about comments is unchanged: a comment still begins with `//`, still requires whitespace after the `//`, and still runs to the end of the line. Carbon continues to provide only line comments; no block or intra-line comments are added. Three observations motivate the change. First, trailing comments are well suited to short _annotations_ attached to a specific entity or value on a line. Second, the lexer design now makes it trivial to lex trailing comments, and in fact requires extra logic and potentially cost to reject them. Third, C++ code routinely uses trailing comments, so allowing them lets Carbon carry the layout of migrated code over directly, rather than reworking each comment to read well in a different structure. Implementation notes (beyond the proposal's design): Keeping trailing comments cheap to lex required a few supporting changes, all of which keep the cost off the lexer's hot path: - The lexer already dispatches `//` to comment lexing wherever it appears, so classifying a comment as trailing is a single O(1) check of whether the `//` is the line's first non-whitespace (`start + indent`). The hot comment path is otherwise unchanged. - That check relies on each line's recorded indentation being its real leading whitespace. Multi-line string literals previously recorded the column where the literal opened for the lines they span; they now record the true (closing-delimiter) indentation instead. - Parser error recovery (`SkipPastLikelyEnd`) had relied on that opening-column indentation to keep tokens following a multi-line string literal attached to the same construct. It now reconstructs that relationship directly by consulting the line on which the literal opened, including when other tokens follow the closing delimiter (such as `''' + "more"`). This is on the cold recovery path. - `CommentData` records the trailing bit in the high bit of its length field, keeping it at 8 bytes. Assisted-by: Claude Code
481 lines
19 KiB
Plaintext
481 lines
19 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
|
|
//
|
|
// AUTOUPDATE
|
|
// TIP: To test this file alone, run:
|
|
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/interop/cpp/basics/cpp_diagnostics.carbon
|
|
// TIP: To dump output, run:
|
|
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interop/cpp/basics/cpp_diagnostics.carbon
|
|
|
|
// ============================================================================
|
|
// One error
|
|
// ============================================================================
|
|
|
|
// --- one_error.h
|
|
|
|
#error "error1"
|
|
|
|
// --- fail_import_cpp_file_with_one_error.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_import_cpp_file_with_one_error.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_error.h:2:2: error: "error1" [CppInteropParseError]
|
|
// CHECK:STDERR: 2 | #error "error1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "one_error.h";
|
|
|
|
// ============================================================================
|
|
// Multiple errors
|
|
// ============================================================================
|
|
|
|
// --- multiple_errors.h
|
|
|
|
#error "error1"
|
|
#error "error2"
|
|
|
|
// --- fail_import_cpp_file_with_multiple_errors.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_import_cpp_file_with_multiple_errors.carbon:[[@LINE+10]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors.h:2:2: error: "error1" [CppInteropParseError]
|
|
// CHECK:STDERR: 2 | #error "error1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_cpp_file_with_multiple_errors.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors.h:3:2: error: "error2" [CppInteropParseError]
|
|
// CHECK:STDERR: 3 | #error "error2"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "multiple_errors.h";
|
|
|
|
// ============================================================================
|
|
// One warning
|
|
// ============================================================================
|
|
|
|
// --- one_warning.h
|
|
|
|
#warning "warning1"
|
|
|
|
// --- import_cpp_file_with_one_warning.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
//@dump-sem-ir-begin
|
|
// CHECK:STDERR: import_cpp_file_with_one_warning.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_warning.h:2:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 2 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "one_warning.h";
|
|
//@dump-sem-ir-end
|
|
|
|
// ============================================================================
|
|
// Multiple warnings
|
|
// ============================================================================
|
|
|
|
// --- multiple_warnings.h
|
|
|
|
#warning "warning1"
|
|
#warning "warning2"
|
|
#warning "warning3"
|
|
|
|
// --- import_cpp_file_with_multiple_warnings.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
//@dump-sem-ir-begin
|
|
// CHECK:STDERR: import_cpp_file_with_multiple_warnings.carbon:[[@LINE+15]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_warnings.h:2:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 2 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: import_cpp_file_with_multiple_warnings.carbon:[[@LINE+10]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_warnings.h:3:2: warning: "warning2" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 3 | #warning "warning2"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: import_cpp_file_with_multiple_warnings.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_warnings.h:4:2: warning: "warning3" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 4 | #warning "warning3"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "multiple_warnings.h";
|
|
//@dump-sem-ir-end
|
|
|
|
// ============================================================================
|
|
// One error and one warning
|
|
// ============================================================================
|
|
|
|
// --- one_error_and_one_warning.h
|
|
|
|
#error "error1"
|
|
#warning "warning1"
|
|
|
|
// --- fail_import_cpp_file_with_one_error_and_one_warning.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_import_cpp_file_with_one_error_and_one_warning.carbon:[[@LINE+10]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_error_and_one_warning.h:2:2: error: "error1" [CppInteropParseError]
|
|
// CHECK:STDERR: 2 | #error "error1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_cpp_file_with_one_error_and_one_warning.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_error_and_one_warning.h:3:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 3 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "one_error_and_one_warning.h";
|
|
|
|
// ============================================================================
|
|
// Multiple errors and multiple warnings
|
|
// ============================================================================
|
|
|
|
// --- multiple_errors_and_multiple_warnings.h
|
|
|
|
#error "error1"
|
|
#error "error2"
|
|
#warning "warning1"
|
|
#warning "warning2"
|
|
#warning "warning3"
|
|
|
|
// --- fail_import_cpp_file_with_multiple_errors_and_multiple_warnings.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_import_cpp_file_with_multiple_errors_and_multiple_warnings.carbon:[[@LINE+25]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:2:2: error: "error1" [CppInteropParseError]
|
|
// CHECK:STDERR: 2 | #error "error1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_cpp_file_with_multiple_errors_and_multiple_warnings.carbon:[[@LINE+20]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:3:2: error: "error2" [CppInteropParseError]
|
|
// CHECK:STDERR: 3 | #error "error2"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_cpp_file_with_multiple_errors_and_multiple_warnings.carbon:[[@LINE+15]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:4:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 4 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_cpp_file_with_multiple_errors_and_multiple_warnings.carbon:[[@LINE+10]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:5:2: warning: "warning2" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 5 | #warning "warning2"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_cpp_file_with_multiple_errors_and_multiple_warnings.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:6:2: warning: "warning3" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 6 | #warning "warning3"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "multiple_errors_and_multiple_warnings.h";
|
|
|
|
// ============================================================================
|
|
// Multiple files with warnings
|
|
// ============================================================================
|
|
|
|
// --- import_multiple_cpp_files_with_warnings.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
//@dump-sem-ir-begin
|
|
// CHECK:STDERR: import_multiple_cpp_files_with_warnings.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_warning.h:2:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 2 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "one_warning.h";
|
|
// CHECK:STDERR: import_multiple_cpp_files_with_warnings.carbon:[[@LINE+15]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_warnings.h:2:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 2 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: import_multiple_cpp_files_with_warnings.carbon:[[@LINE+10]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_warnings.h:3:2: warning: "warning2" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 3 | #warning "warning2"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: import_multiple_cpp_files_with_warnings.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_warnings.h:4:2: warning: "warning3" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 4 | #warning "warning3"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "multiple_warnings.h";
|
|
//@dump-sem-ir-end
|
|
|
|
// ============================================================================
|
|
// Multiple files with errors and warnings
|
|
// ============================================================================
|
|
|
|
// --- fail_import_multiple_cpp_files_with_errors_and_warnings.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_import_multiple_cpp_files_with_errors_and_warnings.carbon:[[@LINE+10]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_error_and_one_warning.h:2:2: error: "error1" [CppInteropParseError]
|
|
// CHECK:STDERR: 2 | #error "error1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_multiple_cpp_files_with_errors_and_warnings.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_error_and_one_warning.h:3:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 3 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "one_error_and_one_warning.h";
|
|
// CHECK:STDERR: fail_import_multiple_cpp_files_with_errors_and_warnings.carbon:[[@LINE+25]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:2:2: error: "error1" [CppInteropParseError]
|
|
// CHECK:STDERR: 2 | #error "error1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_multiple_cpp_files_with_errors_and_warnings.carbon:[[@LINE+20]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:3:2: error: "error2" [CppInteropParseError]
|
|
// CHECK:STDERR: 3 | #error "error2"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_multiple_cpp_files_with_errors_and_warnings.carbon:[[@LINE+15]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:4:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 4 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_multiple_cpp_files_with_errors_and_warnings.carbon:[[@LINE+10]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:5:2: warning: "warning2" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 5 | #warning "warning2"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_multiple_cpp_files_with_errors_and_warnings.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./multiple_errors_and_multiple_warnings.h:6:2: warning: "warning3" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 6 | #warning "warning3"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "multiple_errors_and_multiple_warnings.h";
|
|
|
|
// ============================================================================
|
|
// Indirect error
|
|
// ============================================================================
|
|
|
|
// --- indirect_error.h
|
|
|
|
#include "one_error.h"
|
|
|
|
// --- fail_import_indirect_error.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_import_indirect_error.carbon:[[@LINE+6]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./indirect_error.h:2:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_error.h:2:2: error: "error1" [CppInteropParseError]
|
|
// CHECK:STDERR: 2 | #error "error1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "indirect_error.h";
|
|
|
|
// ============================================================================
|
|
// Indirect warning
|
|
// ============================================================================
|
|
|
|
// --- indirect_warning.h
|
|
|
|
#include "one_warning.h"
|
|
|
|
// --- import_indirect_warning.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
//@dump-sem-ir-begin
|
|
// CHECK:STDERR: import_indirect_warning.carbon:[[@LINE+6]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./indirect_warning.h:2:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_warning.h:2:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 2 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "indirect_warning.h";
|
|
//@dump-sem-ir-end
|
|
|
|
// ============================================================================
|
|
// Lexer error before import
|
|
// ============================================================================
|
|
|
|
// --- fail_import_cpp_library_lexer_error.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
//!Lexer error: whitespace is required after the comment introducer.
|
|
|
|
// TODO: Move this warning to be after the lexer error.
|
|
// CHECK:STDERR: fail_import_cpp_library_lexer_error.carbon:[[@LINE+9]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./one_warning.h:2:2: warning: "warning1" [CppInteropParseWarning]
|
|
// CHECK:STDERR: 2 | #warning "warning1"
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
// CHECK:STDERR: fail_import_cpp_library_lexer_error.carbon:[[@LINE-8]]:3: error: whitespace is required after '//' [NoWhitespaceAfterCommentIntroducer]
|
|
// CHECK:STDERR: //!Lexer error: whitespace is required after the comment introducer.
|
|
// CHECK:STDERR: ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "one_warning.h";
|
|
|
|
// ============================================================================
|
|
// Diagnostic with fix-it hints
|
|
// ============================================================================
|
|
|
|
// --- fix_it_hints.h
|
|
|
|
double score = 0.1
|
|
|
|
// --- fail_import_fix_it_hints.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_import_fix_it_hints.carbon:[[@LINE+6]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./fix_it_hints.h:2:19: error: expected ';' after top level declarator [CppInteropParseError]
|
|
// CHECK:STDERR: 2 | double score = 0.1
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR: | ;
|
|
// CHECK:STDERR:
|
|
import Cpp library "fix_it_hints.h";
|
|
|
|
fn F() {
|
|
// CHECK:STDERR: fail_import_fix_it_hints.carbon:[[@LINE+4]]:3: error: member name `foo` not found in `Cpp` [MemberNameNotFoundInInstScope]
|
|
// CHECK:STDERR: Cpp.foo();
|
|
// CHECK:STDERR: ^~~~~~~
|
|
// CHECK:STDERR:
|
|
Cpp.foo();
|
|
}
|
|
|
|
// ============================================================================
|
|
// Diagnostic with notes
|
|
// ============================================================================
|
|
|
|
// --- with_notes.h
|
|
|
|
void foobar(int);
|
|
|
|
inline void call_foobar() {
|
|
foobar(1, 2);
|
|
}
|
|
|
|
// --- fail_with_notes.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_with_notes.carbon:[[@LINE+9]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./with_notes.h:5:3: error: no matching function for call to 'foobar' [CppInteropParseError]
|
|
// CHECK:STDERR: 5 | foobar(1, 2);
|
|
// CHECK:STDERR: | ^~~~~~
|
|
// CHECK:STDERR: fail_with_notes.carbon:[[@LINE+5]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./with_notes.h:2:6: note: candidate function not viable: requires 1 argument, but 2 were provided [CppInteropParseNote]
|
|
// CHECK:STDERR: 2 | void foobar(int);
|
|
// CHECK:STDERR: | ^ ~~~
|
|
// CHECK:STDERR:
|
|
import Cpp library "with_notes.h";
|
|
|
|
fn F() {
|
|
Cpp.call_foobar();
|
|
}
|
|
|
|
// ============================================================================
|
|
// Context stacks
|
|
// ============================================================================
|
|
|
|
// --- indirect_include.h
|
|
|
|
#define FOO BAR
|
|
#define BAZ void f(error);
|
|
|
|
FOO
|
|
|
|
// --- direct_include.h
|
|
|
|
#define BAR BAZ
|
|
|
|
#include "indirect_include.h"
|
|
|
|
// --- fail_use_context_stack.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_use_context_stack.carbon:[[@LINE+15]]:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./direct_include.h:4:10: in file included here [InCppInclude]
|
|
// CHECK:STDERR: ./indirect_include.h:2:13: in expansion of macro defined here [InCppMacroExpansion]
|
|
// CHECK:STDERR: ./direct_include.h:2:13: in expansion of macro defined here [InCppMacroExpansion]
|
|
// CHECK:STDERR: ./indirect_include.h:3:20: in expansion of macro defined here [InCppMacroExpansion]
|
|
// CHECK:STDERR: ./indirect_include.h:5:1: error: unknown type name 'error' [CppInteropParseError]
|
|
// CHECK:STDERR: 5 | FOO
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR: 2 | #define FOO BAR
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR: 2 | #define BAR BAZ
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR: 3 | #define BAZ void f(error);
|
|
// CHECK:STDERR: | ^
|
|
// CHECK:STDERR:
|
|
import Cpp library "direct_include.h";
|
|
|
|
// ============================================================================
|
|
// Diagnostic location in inline code.
|
|
// ============================================================================
|
|
|
|
// --- fail_loc_in_inline_simple.carbon
|
|
|
|
library "[[@TEST_NAME]]";
|
|
|
|
// CHECK:STDERR: fail_loc_in_inline_simple.carbon:[[@LINE+4]]:9: error: use of undeclared identifier 'banana' [CppInteropParseError]
|
|
// CHECK:STDERR: 8 | int n = banana;
|
|
// CHECK:STDERR: | ^~~~~~
|
|
// CHECK:STDERR:
|
|
import Cpp inline "int n = banana;";
|
|
|
|
// --- fail_loc_in_inline_block.carbon
|
|
|
|
import Cpp inline '''c++
|
|
void f(const int n) {
|
|
// CHECK:STDERR: fail_loc_in_inline_block.carbon:[[@LINE+7]]:3: error: cannot assign to variable 'n' with const-qualified type 'const int' [CppInteropParseError]
|
|
// CHECK:STDERR: 11 | ++n;
|
|
// CHECK:STDERR: | ^ ~
|
|
// CHECK:STDERR: fail_loc_in_inline_block.carbon:[[@LINE-4]]:18: note: variable 'n' declared const here [CppInteropParseNote]
|
|
// CHECK:STDERR: 3 | void f(const int n) {
|
|
// CHECK:STDERR: | ~~~~~~~~~~^
|
|
// CHECK:STDERR:
|
|
++n;
|
|
}
|
|
''';
|
|
|
|
// CHECK:STDOUT: --- import_cpp_file_with_one_warning.carbon
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: file {
|
|
// CHECK:STDOUT: %Cpp.import_cpp = import_cpp {
|
|
// CHECK:STDOUT: import Cpp "one_warning.h"
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: --- import_cpp_file_with_multiple_warnings.carbon
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: file {
|
|
// CHECK:STDOUT: %Cpp.import_cpp = import_cpp {
|
|
// CHECK:STDOUT: import Cpp "multiple_warnings.h"
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: --- import_multiple_cpp_files_with_warnings.carbon
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: file {
|
|
// CHECK:STDOUT: %Cpp.import_cpp = import_cpp {
|
|
// CHECK:STDOUT: import Cpp "one_warning.h"
|
|
// CHECK:STDOUT: import Cpp "multiple_warnings.h"
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: --- import_indirect_warning.carbon
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: file {
|
|
// CHECK:STDOUT: %Cpp.import_cpp = import_cpp {
|
|
// CHECK:STDOUT: import Cpp "indirect_warning.h"
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|