mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
* start correct * Fix #1394 * remove llvm::outs() * Fix #1394 * --- * fix issue-1394 * fix issue-1394 * Update explorer/interpreter/interpreter.cpp Co-authored-by: Geoff Romer <gromer@google.com> * fix issue-1394 * remove and rename test files * add changes from j.m Co-authored-by: m new <michael.burzan@outlook.de> Co-authored-by: Geoff Romer <gromer@google.com>
This commit is contained in:
co-authored by
Geoff Romer
m new
parent
e74c73240c
commit
6cf2272bbe
@@ -799,6 +799,10 @@ auto Interpreter::CallFunction(const CallExpression& call,
|
||||
alt.alt_name(), alt.choice_name(), arg));
|
||||
}
|
||||
case Value::Kind::FunctionValue: {
|
||||
if (phase() == Phase::CompileTime) {
|
||||
return ProgramError(call.source_loc())
|
||||
<< "Function would be called at compile-time";
|
||||
}
|
||||
const FunctionValue& fun_val = cast<FunctionValue>(*fun);
|
||||
const FunctionDeclaration& function = fun_val.declaration();
|
||||
RuntimeScope binding_scope(&heap_);
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
// 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
|
||||
//
|
||||
// RUN: %{not} %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{not} %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
|
||||
package ExplorerTest api;
|
||||
|
||||
interface Iface { let N:! i32; }
|
||||
|
||||
fn PickType(N: i32) -> Type { return i32; }
|
||||
|
||||
fn F[T:! Iface](x: T) -> i32 {
|
||||
// CHECK:COMPILATION ERROR: {{.*}}/explorer/testdata/assoc_const/fail_unknown_value.carbon:[[@LINE+1]]: value of associated constant (T).N is not known
|
||||
var x: PickType(T.N) = 0;
|
||||
return x;
|
||||
}
|
||||
|
||||
impl i32 as Iface where .N == 5 {}
|
||||
|
||||
fn Main() -> i32 {
|
||||
return F(0);
|
||||
}
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
// 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
|
||||
//
|
||||
// RUN: %{not} %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{not} %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
|
||||
package ExplorerTest api;
|
||||
|
||||
interface Iface { let N:! i32; }
|
||||
|
||||
fn PickType(N: i32) -> Type { return i32; }
|
||||
|
||||
fn F[T:! Iface where .N == 5](x: T) -> i32 {
|
||||
// TODO: This should be valid: the value of T.N is known to be 5 here.
|
||||
// CHECK:COMPILATION ERROR: {{.*}}/explorer/testdata/assoc_const/fail_unknown_value_specified_in_constraint.carbon:[[@LINE+1]]: value of associated constant (T).N is not known
|
||||
var x: PickType(T.N) = 0;
|
||||
return x;
|
||||
}
|
||||
|
||||
impl i32 as Iface where .N == 5 {}
|
||||
|
||||
fn Main() -> i32 {
|
||||
return F(0);
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
// 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
|
||||
//
|
||||
// RUN: %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
// CHECK:result: 0
|
||||
|
||||
package ExplorerTest api;
|
||||
|
||||
fn Id(t: Type) -> auto { return t; }
|
||||
|
||||
// Test non-trivial type expression in return type.
|
||||
|
||||
fn Main() -> Id(i32) {
|
||||
return 0;
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
// 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
|
||||
//
|
||||
// RUN: %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
// CHECK:result: 0
|
||||
|
||||
package ExplorerTest api;
|
||||
|
||||
fn Id(t: Type) -> auto { return t; }
|
||||
|
||||
// Test non-trivial type expression in variable declaration statement.
|
||||
|
||||
fn Main() -> i32 {
|
||||
var x: Id(i32) = 0;
|
||||
return x;
|
||||
}
|
||||
+3
-3
@@ -2,10 +2,9 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// RUN: %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// RUN: %{not} %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{not} %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
// CHECK:result: 0
|
||||
|
||||
package ExplorerTest api;
|
||||
|
||||
@@ -13,6 +12,7 @@ fn Id(t: Type) -> auto { return t; }
|
||||
|
||||
// Test non-trivial type expression in parameter type.
|
||||
|
||||
// CHECK:COMPILATION ERROR: {{.*}}/explorer/testdata/function/fail_param_type_is_call.carbon:[[@LINE+1]]: Function would be called at compile-time
|
||||
fn f(x: Id(i32)) -> i32 {
|
||||
return x;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// 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
|
||||
//
|
||||
// RUN: %{not} %{explorer} %s 2>&1 2>&1 | %{FileCheck} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
|
||||
package EmptyIdentifier impl;
|
||||
|
||||
fn apply[T:! Type, U:! Type](f: T, EmptyIdentifier: U)
|
||||
{
|
||||
match (true[true]) {}
|
||||
}
|
||||
|
||||
// CHECK:COMPILATION ERROR: {{.*}}/explorer/testdata/function/fail_return_type_is_call.carbon:[[@LINE+1]]: Function would be called at compile-time
|
||||
fn EmptyIdentifier() -> apply(true, true);
|
||||
|
||||
fn Main() -> i32 {
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
// 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
|
||||
//
|
||||
// RUN: %{not} %{explorer} %s 2>&1 2>&1 | %{FileCheck} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
|
||||
package EmptyIdentifier impl;
|
||||
|
||||
fn test() -> i32 {
|
||||
return 1;
|
||||
}
|
||||
|
||||
fn Main() -> i32 {
|
||||
// CHECK:COMPILATION ERROR: {{.*}}/explorer/testdata/function/fail_var_type_is_call.carbon:[[@LINE+1]]: Function would be called at compile-time
|
||||
var x: test() = 1;
|
||||
return 0;
|
||||
}
|
||||
+3
-3
@@ -2,10 +2,9 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// RUN: %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// RUN: %{not} %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{not} %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
// CHECK:result: 0
|
||||
|
||||
package ExplorerTest api;
|
||||
|
||||
@@ -21,6 +20,7 @@ class WithType(T:! Has(Type)) {
|
||||
}
|
||||
|
||||
fn Main() -> i32 {
|
||||
// CHECK:COMPILATION ERROR: {{.*}}/explorer/testdata/generic_class/fail_use_at_compile_time.carbon:[[@LINE+1]]: Function would be called at compile-time
|
||||
var v: WithType(i32).Get() = 0;
|
||||
return v;
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
// 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
|
||||
//
|
||||
// RUN: %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
// CHECK:result: 0
|
||||
|
||||
package ExplorerTest api;
|
||||
|
||||
class C(T:! Type) {}
|
||||
|
||||
fn F(T:! Type) -> Type {
|
||||
return C(T);
|
||||
}
|
||||
|
||||
fn Main() -> i32 {
|
||||
var v: F(i32) = {};
|
||||
var w: C(i32) = v;
|
||||
return 0;
|
||||
}
|
||||
+3
-3
@@ -2,10 +2,9 @@
|
||||
// Exceptions. See /LICENSE for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
// RUN: %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// RUN: %{not} %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{not} %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
// CHECK:result: 0
|
||||
|
||||
package ExplorerTest api;
|
||||
|
||||
@@ -18,6 +17,7 @@ fn G[T:! X](v: T) -> Type {
|
||||
}
|
||||
|
||||
fn Main() -> i32 {
|
||||
// CHECK:COMPILATION ERROR: {{.*}}/explorer/testdata/generic_function/fail_call_at_compile_time.carbon:[[@LINE+1]]: Function would be called at compile-time
|
||||
var v: G(0) = 0;
|
||||
return v;
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
// 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
|
||||
//
|
||||
// RUN: %{explorer} %s 2>&1 | %{FileCheck-strict} %s
|
||||
// RUN: %{explorer-trace} %s 2>&1 | %{FileCheck-allow-unmatched} %s
|
||||
// AUTOUPDATE: %{explorer} %s
|
||||
// CHECK:Struct OK
|
||||
// CHECK:Choice OK
|
||||
// CHECK:Class OK
|
||||
// CHECK:Interface OK
|
||||
// CHECK:Constraint OK
|
||||
// CHECK:result: 0
|
||||
|
||||
package Foo api;
|
||||
|
||||
choice Choice { Alternative() }
|
||||
class Class { fn F(n: i32) -> i32 { return n + 1; } }
|
||||
interface Interface { fn G[me: Self]() -> Self; }
|
||||
interface AnotherInterface {}
|
||||
|
||||
impl i32 as Interface { fn G[me: i32]() -> i32 { return me + 1; } }
|
||||
impl i32 as AnotherInterface {}
|
||||
|
||||
// TODO: These are intended to be called at compile time. Mark them as
|
||||
// constexpr once we have syntax for that.
|
||||
fn GetStruct() -> Type { return {.n: i32}; }
|
||||
fn GetChoice() -> Type { return Choice; }
|
||||
fn GetClass() -> Type { return Class; }
|
||||
fn GetInterface() -> Type { return Interface; }
|
||||
fn GetConstraint() -> Type { return Interface & AnotherInterface; }
|
||||
|
||||
fn TestStruct() {
|
||||
var s: GetStruct() = {.n = 1};
|
||||
if (s.(GetStruct().n) == 1) {
|
||||
Print("Struct OK");
|
||||
}
|
||||
}
|
||||
|
||||
fn TestChoice() {
|
||||
var c: GetChoice() = GetChoice().Alternative();
|
||||
match (c) {
|
||||
case GetChoice().Alternative() => {
|
||||
Print("Choice OK");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn TestClass() {
|
||||
if (GetClass().F(1) == 2) {
|
||||
Print("Class OK");
|
||||
}
|
||||
}
|
||||
|
||||
fn TestInterface() {
|
||||
var n: i32 = 1;
|
||||
if (n.(GetInterface().G)() == 2) {
|
||||
Print("Interface OK");
|
||||
}
|
||||
}
|
||||
|
||||
fn TestConstraint() {
|
||||
var n: i32 = 1;
|
||||
if (n.(GetConstraint().G)() == 2) {
|
||||
Print("Constraint OK");
|
||||
}
|
||||
}
|
||||
|
||||
fn Main() -> i32 {
|
||||
TestStruct();
|
||||
TestChoice();
|
||||
TestClass();
|
||||
TestInterface();
|
||||
TestConstraint();
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user