mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 10:21:04 +01:00
Add support for inline Cpp declarations. (#6994)
For #6830, add support for inline C++ fragments as a declaration rather than as a packaging directive. For now, this uses `inline Cpp <string-literal>;` as syntax. The prior `import Cpp inline <string-literal>;` is left alone for the time being. We can decide separately whether to remove that. `inline Cpp` requires that there was at least one `import Cpp`. It's not clear to me if that's the right design long-term, but it seems reasonable for now. Assisted-by: Gemini via Google Antigravity
This commit is contained in:
@@ -72,6 +72,52 @@ import Cpp inline '''
|
||||
int n;
|
||||
''';
|
||||
|
||||
// --- inline_cpp.carbon
|
||||
|
||||
inline Cpp '''
|
||||
int n;
|
||||
''';
|
||||
|
||||
// --- fail_inline_cpp_syntax_errors.carbon
|
||||
|
||||
// CHECK:STDERR: fail_inline_cpp_syntax_errors.carbon:[[@LINE+4]]:7: error: expected `Cpp` after `inline` [ExpectedCppAfterInline]
|
||||
// CHECK:STDERR: inline;
|
||||
// CHECK:STDERR: ^
|
||||
// CHECK:STDERR:
|
||||
inline;
|
||||
|
||||
// CHECK:STDERR: fail_inline_cpp_syntax_errors.carbon:[[@LINE+4]]:8: error: expected `Cpp` after `inline` [ExpectedCppAfterInline]
|
||||
// CHECK:STDERR: inline '''
|
||||
// CHECK:STDERR: ^~~
|
||||
// CHECK:STDERR:
|
||||
inline '''
|
||||
int n;
|
||||
''';
|
||||
|
||||
// CHECK:STDERR: fail_inline_cpp_syntax_errors.carbon:[[@LINE+4]]:11: error: expected string literal after `inline Cpp` [ExpectedStringAfterInlineCpp]
|
||||
// CHECK:STDERR: inline Cpp;
|
||||
// CHECK:STDERR: ^
|
||||
// CHECK:STDERR:
|
||||
inline Cpp;
|
||||
|
||||
// CHECK:STDERR: fail_inline_cpp_syntax_errors.carbon:[[@LINE+4]]:12: error: expected string literal after `inline Cpp` [ExpectedStringAfterInlineCpp]
|
||||
// CHECK:STDERR: inline Cpp x;
|
||||
// CHECK:STDERR: ^
|
||||
// CHECK:STDERR:
|
||||
inline Cpp x;
|
||||
|
||||
inline Cpp '''
|
||||
int n;
|
||||
'''
|
||||
// CHECK:STDERR: fail_inline_cpp_syntax_errors.carbon:[[@LINE+4]]:1: error: `inline` declarations must end with a `;` [ExpectedDeclSemi]
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: ^
|
||||
// CHECK:STDERR:
|
||||
|
||||
// --- eof.carbon
|
||||
// This split exists to avoid the "no `;` at EOF" diagnostic above pointing to
|
||||
// the last CHECK:STDOUT line below.
|
||||
|
||||
// CHECK:STDOUT: - filename: fail_bad_syntax.carbon
|
||||
// CHECK:STDOUT: parse_tree: [
|
||||
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
||||
@@ -150,3 +196,42 @@ int n;
|
||||
// CHECK:STDOUT: {kind: 'ImportDecl', text: ';', subtree_size: 5},
|
||||
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: - filename: inline_cpp.carbon
|
||||
// CHECK:STDOUT: parse_tree: [
|
||||
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
||||
// CHECK:STDOUT: {kind: 'InlineIntroducer', text: 'inline'},
|
||||
// CHECK:STDOUT: {kind: 'CppNameExpr', text: 'Cpp'},
|
||||
// CHECK:STDOUT: {kind: 'InlineImportBody', text: ''''
|
||||
// CHECK:STDOUT: int n;
|
||||
// CHECK:STDOUT: ''''},
|
||||
// CHECK:STDOUT: {kind: 'InlineCppDecl', text: ';', subtree_size: 4},
|
||||
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: - filename: fail_inline_cpp_syntax_errors.carbon
|
||||
// CHECK:STDOUT: parse_tree: [
|
||||
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
||||
// CHECK:STDOUT: {kind: 'InlineIntroducer', text: 'inline'},
|
||||
// CHECK:STDOUT: {kind: 'InlineCppDecl', text: ';', has_error: yes, subtree_size: 2},
|
||||
// CHECK:STDOUT: {kind: 'InlineIntroducer', text: 'inline'},
|
||||
// CHECK:STDOUT: {kind: 'InlineCppDecl', text: ';', has_error: yes, subtree_size: 2},
|
||||
// CHECK:STDOUT: {kind: 'InlineIntroducer', text: 'inline'},
|
||||
// CHECK:STDOUT: {kind: 'CppNameExpr', text: 'Cpp'},
|
||||
// CHECK:STDOUT: {kind: 'InlineCppDecl', text: ';', has_error: yes, subtree_size: 3},
|
||||
// CHECK:STDOUT: {kind: 'InlineIntroducer', text: 'inline'},
|
||||
// CHECK:STDOUT: {kind: 'CppNameExpr', text: 'Cpp'},
|
||||
// CHECK:STDOUT: {kind: 'InlineCppDecl', text: ';', has_error: yes, subtree_size: 3},
|
||||
// CHECK:STDOUT: {kind: 'InlineIntroducer', text: 'inline'},
|
||||
// CHECK:STDOUT: {kind: 'CppNameExpr', text: 'Cpp'},
|
||||
// CHECK:STDOUT: {kind: 'InlineImportBody', text: ''''
|
||||
// CHECK:STDOUT: int n;
|
||||
// CHECK:STDOUT: ''''},
|
||||
// CHECK:STDOUT: {kind: 'InlineCppDecl', text: ''''
|
||||
// CHECK:STDOUT: int n;
|
||||
// CHECK:STDOUT: '''', has_error: yes, subtree_size: 4},
|
||||
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
|
||||
// CHECK:STDOUT: ]
|
||||
// CHECK:STDOUT: - filename: eof.carbon
|
||||
// CHECK:STDOUT: parse_tree: [
|
||||
// CHECK:STDOUT: {kind: 'FileStart', text: ''},
|
||||
// CHECK:STDOUT: {kind: 'FileEnd', text: ''},
|
||||
// CHECK:STDOUT: ]
|
||||
|
||||
Reference in New Issue
Block a user