| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- // 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 "explorer/parse_and_execute/parse_and_execute.h"
- #include <gmock/gmock.h>
- #include <gtest/gtest.h>
- namespace Carbon::Testing {
- namespace {
- using ::testing::Eq;
- using ::testing::MatchesRegex;
- TEST(ParseAndExecuteTest, Recursion) {
- std::string source = R"(
- package Test api;
- fn Main() -> i32 {
- return
- )";
- // A high depth that's expected to complete in a few seconds.
- static constexpr int Depth = 50000;
- for (int i = 0; i < Depth; ++i) {
- source += "if true then\n";
- }
- source += "1\n";
- for (int i = 0; i < Depth; ++i) {
- source += "else 0\n";
- }
- source += R"(
- ;
- }
- )";
- TraceStream trace_stream;
- auto err =
- ParseAndExecute("explorer/data/prelude.carbon", "test.carbon", source,
- /*parser_debug=*/false, &trace_stream, &llvm::nulls());
- ASSERT_FALSE(err.ok());
- // Don't expect any particular source location for the error.
- EXPECT_THAT(err.error().message(),
- MatchesRegex("RUNTIME ERROR:.* stack overflow: too many "
- "interpreter actions on stack"));
- }
- } // namespace
- } // namespace Carbon::Testing
|