* 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:
pmqtt
2022-10-13 19:44:53 +02:00
committed by GitHub
co-authored by Geoff Romer m new
parent e74c73240c
commit 6cf2272bbe
12 changed files with 51 additions and 195 deletions
+4
View File
@@ -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_);
-25
View File
@@ -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);
}
@@ -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;
}
-19
View File
@@ -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;
}
@@ -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;
}
+18
View File
@@ -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;
}
@@ -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;
}
@@ -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;
}