mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 19:50:14 +01:00
Example stack:
```
1. node_stack_:
0. FunctionDefinitionStart
1. ReturnStatement -> node1
2. node_block_stack_:
0. block0
1. block1
```
Example trace output:
```
*** SemanticsParseTreeHandler::Build Begin ***
Push 0: FunctionIntroducer
Push 1: DeclaredName
Push 2: ParameterListEnd
Pop 2: ParameterListEnd
Push 2: ParameterList
Pop 2: ParameterList
Pop 0: FunctionIntroducer
AddNode block0: FunctionDeclaration()
AddNode block0: BindName(ident0, node0)
AddNode block0: FunctionDefinition(node0, block1)
Push 0: FunctionDefinitionStart
Push 1: Literal -> IntegerLiteral
AddNode block1: IntegerLiteral(int0): node_xref1
Push 2: StatementEnd
Pop 2: StatementEnd
Pop 1: any (Literal) -> node0
Push 1: ReturnStatement -> ReturnExpression
AddNode block1: ReturnExpression(node0)
Pop 0: FunctionDefinitionStart
Push 0: FunctionDefinition
*** SemanticsParseTreeHandler::Build End ***
cross_reference_irs.size == 2,
cross_references = {
node_xref0 = "xref(ir0, block0, node0)";
node_xref1 = "xref(ir0, block0, node1)";
},
identifiers = {
ident0 = "Foo";
},
integer_literals = {
int0 = 0;
},
node_blocks = {
block0 = {
node0 = FunctionDeclaration();
node1 = BindName(ident0, node0);
node2 = FunctionDefinition(node0, block1);
},
block1 = {
node0 = IntegerLiteral(int0): node_xref1;
node1 = ReturnExpression(node0);
},
}
```
Co-authored-by: Chandler Carruth <chandlerc@gmail.com>
45 lines
1.6 KiB
C++
45 lines
1.6 KiB
C++
// 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
|
|
|
|
#ifndef CARBON_COMMON_CHECK_H_
|
|
#define CARBON_COMMON_CHECK_H_
|
|
|
|
#include "common/check_internal.h"
|
|
|
|
namespace Carbon {
|
|
|
|
// Checks the given condition, and if it's false, prints a stack, streams the
|
|
// error message, then exits. This should be used for unexpected errors, such as
|
|
// a bug in the application.
|
|
//
|
|
// For example:
|
|
// CARBON_CHECK(is_valid) << "Data is not valid!";
|
|
#define CARBON_CHECK(...) \
|
|
(__VA_ARGS__) ? (void)0 \
|
|
: CARBON_CHECK_INTERNAL_STREAM() \
|
|
<< "CHECK failure at " << __FILE__ << ":" << __LINE__ \
|
|
<< ": " #__VA_ARGS__ \
|
|
<< Carbon::Internal::ExitingStream::AddSeparator()
|
|
|
|
// DCHECK calls CHECK in debug mode, and does nothing otherwise.
|
|
#ifndef NDEBUG
|
|
#define CARBON_DCHECK(...) CARBON_CHECK(__VA_ARGS__)
|
|
#else
|
|
#define CARBON_DCHECK(...) CARBON_CHECK(true || (__VA_ARGS__))
|
|
#endif
|
|
|
|
// This is similar to CHECK, but is unconditional. Writing CARBON_FATAL() is
|
|
// clearer than CARBON_CHECK(false) because it avoids confusion about control
|
|
// flow.
|
|
//
|
|
// For example:
|
|
// CARBON_FATAL() << "Unreachable!";
|
|
#define CARBON_FATAL() \
|
|
CARBON_CHECK_INTERNAL_STREAM() \
|
|
<< "FATAL failure at " << __FILE__ << ":" << __LINE__ << ": "
|
|
|
|
} // namespace Carbon
|
|
|
|
#endif // CARBON_COMMON_CHECK_H_
|