mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-06 08:54:47 +01:00
Relax alias restrictions. (#7190)
Implement the alias rules from proposal #5389, wherein an alias is permitted so long as the target has a constant value. While that proposal is not yet accepted, this seems like a reasonable basis for further iteration, and will be useful for the examples we're currently pursuing.
This commit is contained in:
@@ -46,29 +46,16 @@ auto HandleParseNode(Context& context, Parse::AliasId /*node_id*/) -> bool {
|
||||
{.name_id = name_context.name_id_for_new_inst(),
|
||||
.parent_scope_id = name_context.parent_scope_id});
|
||||
|
||||
auto alias_type_id = SemIR::TypeId::None;
|
||||
auto alias_value_id = SemIR::InstId::None;
|
||||
if (auto inst = context.insts().TryGetAs<SemIR::NameRef>(expr_id)) {
|
||||
// Pass through name references, albeit changing the name in use.
|
||||
alias_type_id = inst->type_id;
|
||||
alias_value_id = inst->value_id;
|
||||
} else if (auto inst =
|
||||
context.insts().TryGetAs<SemIR::TypeLiteral>(expr_id)) {
|
||||
// Treat type literals such as `type` or `bool` like name references.
|
||||
alias_type_id = inst->type_id;
|
||||
alias_value_id = inst->value_id;
|
||||
} else {
|
||||
CARBON_DIAGNOSTIC(AliasRequiresNameRef, Error,
|
||||
"alias initializer must be a name reference");
|
||||
context.emitter().Emit(expr_node, AliasRequiresNameRef);
|
||||
alias_type_id = SemIR::ErrorInst::TypeId;
|
||||
alias_value_id = SemIR::ErrorInst::InstId;
|
||||
if (!context.constant_values().Get(expr_id).is_constant()) {
|
||||
CARBON_DIAGNOSTIC(AliasRequiresConstantValue, Error,
|
||||
"alias refers to a runtime value");
|
||||
context.emitter().Emit(expr_node, AliasRequiresConstantValue);
|
||||
}
|
||||
auto alias_id =
|
||||
AddInst<SemIR::AliasBinding>(context, name_context.loc_id,
|
||||
{.type_id = alias_type_id,
|
||||
.entity_name_id = entity_name_id,
|
||||
.value_id = alias_value_id});
|
||||
auto alias_id = AddInst<SemIR::AliasBinding>(
|
||||
context, name_context.loc_id,
|
||||
{.type_id = context.insts().Get(expr_id).type_id(),
|
||||
.entity_name_id = entity_name_id,
|
||||
.value_id = expr_id});
|
||||
|
||||
// Add the name of the binding to the current scope.
|
||||
context.decl_name_stack().PopScope();
|
||||
|
||||
+41
-10
@@ -35,6 +35,18 @@ alias c = b;
|
||||
let d: c = {};
|
||||
//@dump-sem-ir-end
|
||||
|
||||
// --- alias_to_generic.carbon
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
class A(T:! type) {}
|
||||
|
||||
//@dump-sem-ir-begin
|
||||
alias a = A({});
|
||||
//@dump-sem-ir-end
|
||||
|
||||
let v: a = {} as A({});
|
||||
|
||||
// --- fail_control_flow.carbon
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
@@ -82,7 +94,7 @@ library "[[@TEST_NAME]]";
|
||||
var a: () = ();
|
||||
var b: ()* = &a;
|
||||
|
||||
// CHECK:STDERR: fail_not_constant.carbon:[[@LINE+4]]:11: error: alias initializer must be a name reference [AliasRequiresNameRef]
|
||||
// CHECK:STDERR: fail_not_constant.carbon:[[@LINE+4]]:11: error: alias refers to a runtime value [AliasRequiresConstantValue]
|
||||
// CHECK:STDERR: alias c = *b;
|
||||
// CHECK:STDERR: ^~
|
||||
// CHECK:STDERR:
|
||||
@@ -92,14 +104,10 @@ alias c = *b;
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
// CHECK:STDERR: fail_params.carbon:[[@LINE+8]]:8: error: `alias` declaration cannot have parameters [UnexpectedDeclNameParams]
|
||||
// CHECK:STDERR: fail_params.carbon:[[@LINE+4]]:8: error: `alias` declaration cannot have parameters [UnexpectedDeclNameParams]
|
||||
// CHECK:STDERR: alias A(T:! type) = T*;
|
||||
// CHECK:STDERR: ^~~~~~~~~~
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: fail_params.carbon:[[@LINE+4]]:21: error: alias initializer must be a name reference [AliasRequiresNameRef]
|
||||
// CHECK:STDERR: alias A(T:! type) = T*;
|
||||
// CHECK:STDERR: ^~
|
||||
// CHECK:STDERR:
|
||||
alias A(T:! type) = T*;
|
||||
|
||||
// --- fail_modifiers.carbon
|
||||
@@ -155,7 +163,7 @@ extern alias C = Class;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c: type = alias_binding c, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c: type = alias_binding c, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
@@ -176,11 +184,11 @@ extern alias C = Class;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %a: type = alias_binding a, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %a: type = alias_binding a, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %a.ref: type = name_ref a, %a [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %b: type = alias_binding b, %a [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %b: type = alias_binding b, %a.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %b.ref: type = name_ref b, %b [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c: type = alias_binding c, %b [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c: type = alias_binding c, %b.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %d.patt: %pattern_type = value_binding_pattern d [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
@@ -199,3 +207,26 @@ extern alias C = Class;
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- alias_to_generic.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %A.type: type = generic_class_type @A [concrete]
|
||||
// CHECK:STDOUT: %A.generic: %A.type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete]
|
||||
// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete]
|
||||
// CHECK:STDOUT: %A.ed7: type = class_type @A, @A(%empty_struct_type) [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: %A.ref: %A.type = name_ref A, %A.decl [concrete = constants.%A.generic]
|
||||
// CHECK:STDOUT: %.loc7_14: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct]
|
||||
// CHECK:STDOUT: %.loc7_15: type = converted %.loc7_14, constants.%empty_struct_type [concrete = constants.%empty_struct_type]
|
||||
// CHECK:STDOUT: %A: type = class_type @A, @A(constants.%empty_struct_type) [concrete = constants.%A.ed7]
|
||||
// CHECK:STDOUT: %a: type = alias_binding a, %A [concrete = constants.%A.ed7]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+8
-13
@@ -26,18 +26,13 @@ library "[[@TEST_NAME]]";
|
||||
alias b = bool;
|
||||
//@dump-sem-ir-end
|
||||
|
||||
// --- fail_bool_value.carbon
|
||||
// --- bool_value.carbon
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
//@dump-sem-ir-begin
|
||||
// CHECK:STDERR: fail_bool_value.carbon:[[@LINE+4]]:11: error: alias initializer must be a name reference [AliasRequiresNameRef]
|
||||
// CHECK:STDERR: alias a = false;
|
||||
// CHECK:STDERR: ^~~~~
|
||||
// CHECK:STDERR:
|
||||
alias a = false;
|
||||
|
||||
// This fails silently due to the above diagnostic.
|
||||
let a_test: bool = a;
|
||||
//@dump-sem-ir-end
|
||||
|
||||
@@ -50,17 +45,17 @@ let a_test: bool = a;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: %i32: type = type_literal constants.%i32 [concrete = constants.%i32]
|
||||
// CHECK:STDOUT: %a: type = alias_binding a, constants.%i32 [concrete = constants.%i32]
|
||||
// CHECK:STDOUT: %a: type = alias_binding a, %i32 [concrete = constants.%i32]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- bool.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: %.loc5: type = type_literal bool [concrete = bool]
|
||||
// CHECK:STDOUT: %b: type = alias_binding b, bool [concrete = bool]
|
||||
// CHECK:STDOUT: %b: type = alias_binding b, %.loc5 [concrete = bool]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_bool_value.carbon
|
||||
// CHECK:STDOUT: --- bool_value.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %false: bool = bool_literal false [concrete]
|
||||
@@ -69,17 +64,17 @@ let a_test: bool = a;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: %false: bool = bool_literal false [concrete = constants.%false]
|
||||
// CHECK:STDOUT: %a: <error> = alias_binding a, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %a: bool = alias_binding a, %false [concrete = constants.%false]
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %a_test.patt: %pattern_type.831 = value_binding_pattern a_test [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %.loc12: type = type_literal bool [concrete = bool]
|
||||
// CHECK:STDOUT: %a_test: bool = value_binding a_test, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %.loc7: type = type_literal bool [concrete = bool]
|
||||
// CHECK:STDOUT: %a_test: bool = value_binding a_test, @__global_init.%a.ref
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %a.ref: <error> = name_ref a, file.%a [concrete = <error>]
|
||||
// CHECK:STDOUT: %a.ref: bool = name_ref a, file.%a [concrete = constants.%false]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+1
-1
@@ -96,7 +96,7 @@ var d: D* = &c;
|
||||
// CHECK:STDOUT: %Core.import = import Core
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: class @C {
|
||||
|
||||
+4
-4
@@ -105,7 +105,7 @@ var c: () = a_alias_alias;
|
||||
// CHECK:STDOUT: %Core.import = import Core
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref.loc6: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c_alias: type = alias_binding c_alias, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c_alias: type = alias_binding c_alias, %C.ref.loc6 [concrete = constants.%C]
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type.506 = ref_binding_pattern a [concrete]
|
||||
// CHECK:STDOUT: %a.var_patt: %pattern_type.506 = var_pattern %a.patt [concrete]
|
||||
@@ -185,7 +185,7 @@ var c: () = a_alias_alias;
|
||||
// CHECK:STDOUT: %Core.import = import Core
|
||||
// CHECK:STDOUT: %default.import = import <none>
|
||||
// CHECK:STDOUT: %c_alias.ref.loc6: type = name_ref c_alias, imports.%Main.c_alias [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c_alias_alias: type = alias_binding c_alias_alias, imports.%Main.c_alias [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c_alias_alias: type = alias_binding c_alias_alias, %c_alias.ref.loc6 [concrete = constants.%C]
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %b.patt: %pattern_type.506 = ref_binding_pattern b [concrete]
|
||||
// CHECK:STDOUT: %b.var_patt: %pattern_type.506 = var_pattern %b.patt [concrete]
|
||||
@@ -324,7 +324,7 @@ var c: () = a_alias_alias;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %a: ref %empty_tuple.type = ref_binding a, %a.var [concrete = %a.var]
|
||||
// CHECK:STDOUT: %a.ref: ref %empty_tuple.type = name_ref a, %a [concrete = %a.var]
|
||||
// CHECK:STDOUT: %a_alias: ref %empty_tuple.type = alias_binding a_alias, %a [concrete = %a.var]
|
||||
// CHECK:STDOUT: %a_alias: ref %empty_tuple.type = alias_binding a_alias, %a.ref [concrete = %a.var]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
@@ -367,7 +367,7 @@ var c: () = a_alias_alias;
|
||||
// CHECK:STDOUT: %Core.import = import Core
|
||||
// CHECK:STDOUT: %default.import = import <none>
|
||||
// CHECK:STDOUT: %a_alias.ref: ref %empty_tuple.type = name_ref a_alias, imports.%Main.a_alias [concrete = imports.%a.var]
|
||||
// CHECK:STDOUT: %a_alias_alias: ref %empty_tuple.type = alias_binding a_alias_alias, imports.%Main.a_alias [concrete = imports.%a.var]
|
||||
// CHECK:STDOUT: %a_alias_alias: ref %empty_tuple.type = alias_binding a_alias_alias, %a_alias.ref [concrete = imports.%a.var]
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %b.patt: %pattern_type = ref_binding_pattern b [concrete]
|
||||
// CHECK:STDOUT: %b.var_patt: %pattern_type = var_pattern %b.patt [concrete]
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ var inst: Test.A = {};
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %A: type = alias_binding A, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %A: type = alias_binding A, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: class @C {
|
||||
|
||||
+4
-4
@@ -54,13 +54,13 @@ var a_val: a = {.v = b_val.v};
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %a: type = alias_binding a, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %a: type = alias_binding a, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %a.ref: type = name_ref a, %a [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %b: type = alias_binding b, %a [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %b: type = alias_binding b, %a.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %b.ref: type = name_ref b, %b [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c: type = alias_binding c, %b [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c: type = alias_binding c, %b.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %c.ref: type = name_ref c, %c [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %d: type = alias_binding d, %c [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %d: type = alias_binding d, %c.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: class @C {
|
||||
|
||||
+2
-6
@@ -34,14 +34,10 @@ library "[[@TEST_NAME]]";
|
||||
namespace NS;
|
||||
|
||||
fn F() -> {} {
|
||||
// CHECK:STDERR: fail_local_in_namespace.carbon:[[@LINE+8]]:9: error: name `NS` not found [NameNotFound]
|
||||
// CHECK:STDERR: fail_local_in_namespace.carbon:[[@LINE+4]]:9: error: name `NS` not found [NameNotFound]
|
||||
// CHECK:STDERR: alias NS.a = {};
|
||||
// CHECK:STDERR: ^~
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: fail_local_in_namespace.carbon:[[@LINE+4]]:16: error: alias initializer must be a name reference [AliasRequiresNameRef]
|
||||
// CHECK:STDERR: alias NS.a = {};
|
||||
// CHECK:STDERR: ^~
|
||||
// CHECK:STDERR:
|
||||
alias NS.a = {};
|
||||
// CHECK:STDERR: fail_local_in_namespace.carbon:[[@LINE+4]]:10: error: member name `a` not found in `NS` [MemberNameNotFoundInInstScope]
|
||||
// CHECK:STDERR: return NS.a;
|
||||
@@ -62,7 +58,7 @@ fn F() -> {} {
|
||||
// CHECK:STDOUT: .a = %a
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %a: type = alias_binding a, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %a: type = alias_binding a, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
|
||||
-38
@@ -1,38 +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
|
||||
//
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/destroy.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/alias/local.carbon
|
||||
// TIP: To dump output, run:
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/alias/local.carbon
|
||||
|
||||
// --- local.carbon
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
fn F() -> () {
|
||||
var a: () = ();
|
||||
//@dump-sem-ir-begin
|
||||
alias b = a;
|
||||
//@dump-sem-ir-end
|
||||
return b;
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: --- local.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @F() -> out %return.param: %empty_tuple.type {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %a.ref: ref %empty_tuple.type = name_ref a, %a
|
||||
// CHECK:STDOUT: %b: ref %empty_tuple.type = alias_binding b, %a
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
// 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-FILE: toolchain/testing/testdata/min_prelude/destroy.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/alias/var.carbon
|
||||
// TIP: To dump output, run:
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/alias/var.carbon
|
||||
|
||||
// --- global.carbon
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
var a: () = ();
|
||||
|
||||
fn F() -> () {
|
||||
//@dump-sem-ir-begin
|
||||
// TODO: Decide if this should be allowed, and if so, whether it should be
|
||||
// spelled as
|
||||
//
|
||||
// alias b = ref a;
|
||||
alias b = a;
|
||||
//@dump-sem-ir-end
|
||||
return b;
|
||||
}
|
||||
|
||||
// --- fail_local.carbon
|
||||
|
||||
library "[[@TEST_NAME]]";
|
||||
|
||||
fn F() -> () {
|
||||
var a: () = ();
|
||||
//@dump-sem-ir-begin
|
||||
// CHECK:STDERR: fail_local.carbon:[[@LINE+4]]:13: error: alias refers to a runtime value [AliasRequiresConstantValue]
|
||||
// CHECK:STDERR: alias b = a;
|
||||
// CHECK:STDERR: ^
|
||||
// CHECK:STDERR:
|
||||
alias b = a;
|
||||
//@dump-sem-ir-end
|
||||
return b;
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: --- global.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @F() -> out %return.param: %empty_tuple.type {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %a.ref: ref %empty_tuple.type = name_ref a, file.%a [concrete = file.%a.var]
|
||||
// CHECK:STDOUT: %b: ref %empty_tuple.type = alias_binding b, %a.ref [concrete = file.%a.var]
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_local.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @F() -> out %return.param: %empty_tuple.type {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: %a.ref: ref %empty_tuple.type = name_ref a, %a
|
||||
// CHECK:STDOUT: %b: ref %empty_tuple.type = alias_binding b, %a.ref
|
||||
// CHECK:STDOUT: <elided>
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
+1
-1
@@ -252,7 +252,7 @@ class B {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %B: type = alias_binding B, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %B: type = alias_binding B, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: class @C;
|
||||
|
||||
+2
-2
@@ -188,7 +188,7 @@ var ptr: E* = &value;
|
||||
// CHECK:STDOUT: %Core.import = import Core
|
||||
// CHECK:STDOUT: %default.import = import <none>
|
||||
// CHECK:STDOUT: %C.ref.loc6: type = name_ref C, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref.loc6 [concrete = constants.%C]
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %b_val.patt: %pattern_type.7c7 = ref_binding_pattern b_val [concrete]
|
||||
// CHECK:STDOUT: %b_val.var_patt: %pattern_type.7c7 = var_pattern %b_val.patt [concrete]
|
||||
@@ -284,7 +284,7 @@ var ptr: E* = &value;
|
||||
// CHECK:STDOUT: %Core.import = import Core
|
||||
// CHECK:STDOUT: %default.import = import <none>
|
||||
// CHECK:STDOUT: %C.ref.loc6: type = name_ref C, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %E: type = alias_binding E, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %E: type = alias_binding E, %C.ref.loc6 [concrete = constants.%C]
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %c_val.patt: %pattern_type.7c7 = ref_binding_pattern c_val [concrete]
|
||||
// CHECK:STDOUT: %c_val.var_patt: %pattern_type.7c7 = var_pattern %c_val.patt [concrete]
|
||||
|
||||
@@ -221,7 +221,7 @@ var x: () = D.C.F();
|
||||
// CHECK:STDOUT: class @D {
|
||||
// CHECK:STDOUT: %package.ref: <namespace> = name_ref package, package [concrete = package]
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %C: type = alias_binding C, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %C: type = alias_binding C, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type]
|
||||
// CHECK:STDOUT: complete_type_witness = %complete_type
|
||||
// CHECK:STDOUT:
|
||||
@@ -440,7 +440,7 @@ var x: () = D.C.F();
|
||||
// CHECK:STDOUT: %Main.D: type = import_ref Main//e, D, loaded [concrete = constants.%D]
|
||||
// CHECK:STDOUT: %Main.import_ref.8f2: <witness> = import_ref Main//e, loc8_1, loaded [concrete = constants.%complete_type]
|
||||
// CHECK:STDOUT: %Main.import_ref.1d5 = import_ref Main//e, inst{{[0-9A-F]+}} [no loc], unloaded
|
||||
// CHECK:STDOUT: %Main.import_ref.7a9: type = import_ref Main//e, loc7_9, loaded [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Main.import_ref.c58: type = import_ref Main//e, loc7_9, loaded [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Main.import_ref.8f3: <witness> = import_ref Main//e, inst{{[0-9A-F]+}} [indirect], loaded [concrete = constants.%complete_type]
|
||||
// CHECK:STDOUT: %Main.import_ref.76e = import_ref Main//e, inst{{[0-9A-F]+}} [indirect], unloaded
|
||||
// CHECK:STDOUT: %Main.import_ref.c63: %C.F.type = import_ref Main//e, inst{{[0-9A-F]+}} [indirect], loaded [concrete = constants.%C.F]
|
||||
@@ -469,7 +469,7 @@ var x: () = D.C.F();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: .Self = imports.%Main.import_ref.1d5
|
||||
// CHECK:STDOUT: .C = imports.%Main.import_ref.7a9
|
||||
// CHECK:STDOUT: .C = imports.%Main.import_ref.c58
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: class @C [from "e.carbon"] {
|
||||
@@ -485,7 +485,7 @@ var x: () = D.C.F();
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%D]
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.import_ref.7a9 [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.import_ref.c58 [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %F.ref: %C.F.type = name_ref F, imports.%Main.import_ref.c63 [concrete = constants.%C.F]
|
||||
// CHECK:STDOUT: %C.F.call: init %empty_tuple.type = call %F.ref()
|
||||
// CHECK:STDOUT: assign file.%x.var, %C.F.call
|
||||
@@ -510,7 +510,7 @@ var x: () = D.C.F();
|
||||
// CHECK:STDOUT: %Main.D: type = import_ref Main//e, D, loaded [concrete = constants.%D]
|
||||
// CHECK:STDOUT: %Main.import_ref.8f2: <witness> = import_ref Main//e, loc8_1, loaded [concrete = constants.%complete_type]
|
||||
// CHECK:STDOUT: %Main.import_ref.1d5 = import_ref Main//e, inst{{[0-9A-F]+}} [no loc], unloaded
|
||||
// CHECK:STDOUT: %Main.import_ref.7a9: type = import_ref Main//e, loc7_9, loaded [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Main.import_ref.c58: type = import_ref Main//e, loc7_9, loaded [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Main.import_ref.8f3: <witness> = import_ref Main//e, inst{{[0-9A-F]+}} [indirect], loaded [concrete = constants.%complete_type]
|
||||
// CHECK:STDOUT: %Main.import_ref.76e = import_ref Main//e, inst{{[0-9A-F]+}} [indirect], unloaded
|
||||
// CHECK:STDOUT: %Main.import_ref.c63: %C.F.type = import_ref Main//e, inst{{[0-9A-F]+}} [indirect], loaded [concrete = constants.%C.F]
|
||||
@@ -539,7 +539,7 @@ var x: () = D.C.F();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !members:
|
||||
// CHECK:STDOUT: .Self = imports.%Main.import_ref.1d5
|
||||
// CHECK:STDOUT: .C = imports.%Main.import_ref.7a9
|
||||
// CHECK:STDOUT: .C = imports.%Main.import_ref.c58
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: class @C [from "e.carbon"] {
|
||||
@@ -555,7 +555,7 @@ var x: () = D.C.F();
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %D.ref: type = name_ref D, imports.%Main.D [concrete = constants.%D]
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.import_ref.7a9 [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.import_ref.c58 [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %F.ref: %C.F.type = name_ref F, imports.%Main.import_ref.c63 [concrete = constants.%C.F]
|
||||
// CHECK:STDOUT: %C.F.call: init %empty_tuple.type = call %F.ref()
|
||||
// CHECK:STDOUT: assign file.%x.var, %C.F.call
|
||||
|
||||
+1
-1
@@ -343,7 +343,7 @@ fn CallGOnInitializingExpr() -> i32 {
|
||||
// CHECK:STDOUT: %return: ref %i32 = return_slot %return.param
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %F.ref: %Class.F.type = name_ref F, %Class.F.decl [concrete = constants.%Class.F]
|
||||
// CHECK:STDOUT: %A: %Class.F.type = alias_binding A, %Class.F.decl [concrete = constants.%Class.F]
|
||||
// CHECK:STDOUT: %A: %Class.F.type = alias_binding A, %F.ref [concrete = constants.%Class.F]
|
||||
// CHECK:STDOUT: %i32: type = type_literal constants.%i32 [concrete = constants.%i32]
|
||||
// CHECK:STDOUT: %.loc21: %Class.elem = field_decl k, element0 [concrete]
|
||||
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness constants.%struct_type.k.0bf [concrete = constants.%complete_type.954]
|
||||
|
||||
+6
-6
@@ -211,7 +211,7 @@ fn Base.F[ref self: Base]() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -532,7 +532,7 @@ fn Base.F[ref self: Base]() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -706,7 +706,7 @@ fn Base.F[ref self: Base]() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.337be0.1 = class_decl @Foo.loc7 [concrete = constants.%Foo.generic.6e878d.1] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -788,7 +788,7 @@ fn Base.F[ref self: Base]() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.337be0.1 = class_decl @Foo.loc7 [concrete = constants.%Foo.generic.6e878d.1] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -870,7 +870,7 @@ fn Base.F[ref self: Base]() {
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.337be0.1 = class_decl @Foo.loc7 [concrete = constants.%Foo.generic.6e878d.1] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -1007,7 +1007,7 @@ fn Base.F[ref self: Base]() {
|
||||
// CHECK:STDOUT: %default.import.loc2_30.1 = import <none>
|
||||
// CHECK:STDOUT: %default.import.loc2_30.2 = import <none>
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl: %Foo.type = class_decl @Foo [concrete = constants.%Foo.generic] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
|
||||
+1
-1
@@ -64,7 +64,7 @@ fn Main() {
|
||||
// CHECK:STDOUT: %return: ref %empty_tuple.type = return_slot %return.param
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %A.ref: %A.type = name_ref A, %A.decl [concrete = constants.%A]
|
||||
// CHECK:STDOUT: %B: %A.type = alias_binding B, %A.decl [concrete = constants.%A]
|
||||
// CHECK:STDOUT: %B: %A.type = alias_binding B, %A.ref [concrete = constants.%A]
|
||||
// CHECK:STDOUT: %Main.decl: %Main.type = fn_decl @Main [concrete = constants.%Main] {} {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -335,7 +335,7 @@ fn B() {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %A.decl: %A.type = fn_decl @A [concrete = constants.%A] {} {}
|
||||
// CHECK:STDOUT: %A.ref: %A.type = name_ref A, %A.decl [concrete = constants.%A]
|
||||
// CHECK:STDOUT: %B: %A.type = alias_binding B, %A.decl [concrete = constants.%A]
|
||||
// CHECK:STDOUT: %B: %A.type = alias_binding B, %A.ref [concrete = constants.%A]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @A();
|
||||
|
||||
@@ -220,7 +220,7 @@ fn Foo(unused a: const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type = fn_decl @Foo [concrete = constants.%Foo] {
|
||||
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]
|
||||
@@ -480,7 +480,7 @@ fn Foo(unused a: const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl: %Foo.type = fn_decl @Foo [concrete = constants.%Foo] {
|
||||
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]
|
||||
@@ -596,7 +596,7 @@ fn Foo(unused a: const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.47530a.1 = fn_decl @Foo.loc7 [concrete = constants.%Foo.9ec12f.1] {
|
||||
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]
|
||||
@@ -651,7 +651,7 @@ fn Foo(unused a: const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.47530a.1 = fn_decl @Foo.loc7 [concrete = constants.%Foo.9ec12f.1] {
|
||||
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]
|
||||
@@ -710,7 +710,7 @@ fn Foo(unused a: const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.47530a.1 = fn_decl @Foo.loc7 [concrete = constants.%Foo.9ec12f.1] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -788,7 +788,7 @@ fn Foo(unused a: const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type = fn_decl @Foo [concrete = constants.%Foo] {
|
||||
// CHECK:STDOUT: %return.param_patt: %pattern_type = out_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %return.patt: %pattern_type = return_slot_pattern %return.param_patt, %D.ref [concrete]
|
||||
@@ -888,7 +888,7 @@ fn Foo(unused a: const (const C)) {}
|
||||
// CHECK:STDOUT: %default.import.loc2_30.1 = import <none>
|
||||
// CHECK:STDOUT: %default.import.loc2_30.2 = import <none>
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl: %Foo.type = fn_decl @Foo [concrete = constants.%Foo] {
|
||||
// CHECK:STDOUT: %a.param_patt: %pattern_type = value_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = at_binding_pattern a, %a.param_patt [concrete]
|
||||
|
||||
+2
-2
@@ -51,9 +51,9 @@ impl AC as AI {}
|
||||
// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {}
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %I.ref: type = name_ref I, %I.decl [concrete = constants.%I.type]
|
||||
// CHECK:STDOUT: %AI: type = alias_binding AI, %I.decl [concrete = constants.%I.type]
|
||||
// CHECK:STDOUT: %AI: type = alias_binding AI, %I.ref [concrete = constants.%I.type]
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %AC: type = alias_binding AC, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %AC: type = alias_binding AC, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: impl_decl @C.as.I.impl.e47215.1 [concrete] {} {
|
||||
// CHECK:STDOUT: %AC.ref: type = name_ref AC, file.%AC [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %AI.ref: type = name_ref AI, file.%AI [concrete = constants.%I.type]
|
||||
|
||||
@@ -599,7 +599,7 @@ class SelfNestedBadReturnType {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: impl @FAlias.as.I.impl: %Self.ref as %I.ref {
|
||||
// CHECK:STDOUT: %PossiblyF.ref: %PossiblyF.type = name_ref PossiblyF, file.%PossiblyF.decl [concrete = constants.%PossiblyF]
|
||||
// CHECK:STDOUT: %F: %PossiblyF.type = alias_binding F, file.%PossiblyF.decl [concrete = constants.%PossiblyF]
|
||||
// CHECK:STDOUT: %F: %PossiblyF.type = alias_binding F, %PossiblyF.ref [concrete = constants.%PossiblyF]
|
||||
// CHECK:STDOUT: %I.impl_witness_table = impl_witness_table (<error>), @FAlias.as.I.impl [concrete]
|
||||
// CHECK:STDOUT: %I.impl_witness: <witness> = impl_witness %I.impl_witness_table [concrete = constants.%I.impl_witness.109]
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+1
-1
@@ -105,7 +105,7 @@ fn G(c: C) {
|
||||
// CHECK:STDOUT: class @C {
|
||||
// CHECK:STDOUT: %HasF.ref: type = name_ref HasF, file.%HasF.decl [concrete = constants.%HasF.type]
|
||||
// CHECK:STDOUT: %F.ref: %HasF.assoc_type = name_ref F, @HasF.WithSelf.%assoc0 [concrete = constants.%assoc0]
|
||||
// CHECK:STDOUT: %G: %HasF.assoc_type = alias_binding G, @HasF.WithSelf.%assoc0 [concrete = constants.%assoc0]
|
||||
// CHECK:STDOUT: %G: %HasF.assoc_type = alias_binding G, %F.ref [concrete = constants.%assoc0]
|
||||
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type]
|
||||
// CHECK:STDOUT: complete_type_witness = %complete_type
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -87,7 +87,7 @@ fn F(c: C) {
|
||||
// CHECK:STDOUT: class @C {
|
||||
// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type]
|
||||
// CHECK:STDOUT: %F.ref: %I.assoc_type = name_ref F, @I.WithSelf.%assoc0 [concrete = constants.%assoc0]
|
||||
// CHECK:STDOUT: %F: %I.assoc_type = alias_binding F, @I.WithSelf.%assoc0 [concrete = constants.%assoc0]
|
||||
// CHECK:STDOUT: %F: %I.assoc_type = alias_binding F, %F.ref [concrete = constants.%assoc0]
|
||||
// CHECK:STDOUT: %complete_type: <witness> = complete_type_witness constants.%empty_struct_type [concrete = constants.%complete_type]
|
||||
// CHECK:STDOUT: complete_type_witness = %complete_type
|
||||
// CHECK:STDOUT:
|
||||
|
||||
@@ -105,7 +105,7 @@ interface C {
|
||||
// CHECK:STDOUT: !with Self:
|
||||
// CHECK:STDOUT: %I2.ref: type = name_ref I2, file.%I2.decl [concrete = constants.%I2.type]
|
||||
// CHECK:STDOUT: %T2.ref: %I2.assoc_type = name_ref T2, @T2.%assoc0 [concrete = constants.%assoc0.7c1]
|
||||
// CHECK:STDOUT: %U2: %I2.assoc_type = alias_binding U2, @T2.%assoc0 [concrete = constants.%assoc0.7c1]
|
||||
// CHECK:STDOUT: %U2: %I2.assoc_type = alias_binding U2, %T2.ref [concrete = constants.%assoc0.7c1]
|
||||
// CHECK:STDOUT: %J2.WithSelf.F2.decl: @J2.WithSelf.%J2.WithSelf.F2.type (%J2.WithSelf.F2.type) = fn_decl @J2.WithSelf.F2 [symbolic = @J2.WithSelf.%J2.WithSelf.F2 (constants.%J2.WithSelf.F2)] {
|
||||
// CHECK:STDOUT: %return.param_patt: @J2.WithSelf.F2.%pattern_type (%pattern_type.a14) = out_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %return.patt: @J2.WithSelf.F2.%pattern_type (%pattern_type.a14) = return_slot_pattern %return.param_patt, %U2.ref [concrete]
|
||||
|
||||
+4
-4
@@ -333,16 +333,16 @@ var f: ForwardDeclared* = &f_ref.f;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %Basic.ref.loc10: type = name_ref Basic, imports.%Main.Basic [concrete = constants.%Basic.type]
|
||||
// CHECK:STDOUT: %T.ref.loc10: %Basic.assoc_type = name_ref T, imports.%Main.import_ref.736 [concrete = constants.%assoc0.a68]
|
||||
// CHECK:STDOUT: %UseBasicT: %Basic.assoc_type = alias_binding UseBasicT, imports.%Main.import_ref.736 [concrete = constants.%assoc0.a68]
|
||||
// CHECK:STDOUT: %UseBasicT: %Basic.assoc_type = alias_binding UseBasicT, %T.ref.loc10 [concrete = constants.%assoc0.a68]
|
||||
// CHECK:STDOUT: %Basic.ref.loc11: type = name_ref Basic, imports.%Main.Basic [concrete = constants.%Basic.type]
|
||||
// CHECK:STDOUT: %F.ref.loc11: %Basic.assoc_type = name_ref F, imports.%Main.import_ref.c83 [concrete = constants.%assoc1.448]
|
||||
// CHECK:STDOUT: %UseBasicF: %Basic.assoc_type = alias_binding UseBasicF, imports.%Main.import_ref.c83 [concrete = constants.%assoc1.448]
|
||||
// CHECK:STDOUT: %UseBasicF: %Basic.assoc_type = alias_binding UseBasicF, %F.ref.loc11 [concrete = constants.%assoc1.448]
|
||||
// CHECK:STDOUT: %ForwardDeclared.ref.loc13: type = name_ref ForwardDeclared, imports.%Main.ForwardDeclared [concrete = constants.%ForwardDeclared.type]
|
||||
// CHECK:STDOUT: %T.ref.loc13: %ForwardDeclared.assoc_type = name_ref T, imports.%Main.import_ref.fa6 [concrete = constants.%assoc0.c28]
|
||||
// CHECK:STDOUT: %UseForwardDeclaredT: %ForwardDeclared.assoc_type = alias_binding UseForwardDeclaredT, imports.%Main.import_ref.fa6 [concrete = constants.%assoc0.c28]
|
||||
// CHECK:STDOUT: %UseForwardDeclaredT: %ForwardDeclared.assoc_type = alias_binding UseForwardDeclaredT, %T.ref.loc13 [concrete = constants.%assoc0.c28]
|
||||
// CHECK:STDOUT: %ForwardDeclared.ref.loc14: type = name_ref ForwardDeclared, imports.%Main.ForwardDeclared [concrete = constants.%ForwardDeclared.type]
|
||||
// CHECK:STDOUT: %F.ref.loc14: %ForwardDeclared.assoc_type = name_ref F, imports.%Main.import_ref.9f2 [concrete = constants.%assoc1.e73]
|
||||
// CHECK:STDOUT: %UseForwardDeclaredF: %ForwardDeclared.assoc_type = alias_binding UseForwardDeclaredF, imports.%Main.import_ref.9f2 [concrete = constants.%assoc1.e73]
|
||||
// CHECK:STDOUT: %UseForwardDeclaredF: %ForwardDeclared.assoc_type = alias_binding UseForwardDeclaredF, %F.ref.loc14 [concrete = constants.%assoc1.e73]
|
||||
// CHECK:STDOUT: name_binding_decl {
|
||||
// CHECK:STDOUT: %f.patt: %pattern_type.063 = ref_binding_pattern f [concrete]
|
||||
// CHECK:STDOUT: %f.var_patt: %pattern_type.063 = var_pattern %f.patt [concrete]
|
||||
|
||||
@@ -219,7 +219,7 @@ interface Foo(a:! const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.5ed = interface_decl @Foo [concrete = constants.%Foo.generic] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -578,7 +578,7 @@ interface Foo(a:! const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl: %Foo.type = interface_decl @Foo [concrete = constants.%Foo.generic] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -795,7 +795,7 @@ interface Foo(a:! const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.5ede67.1 = interface_decl @Foo.loc7 [concrete = constants.%Foo.generic.fda91f.1] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -885,7 +885,7 @@ interface Foo(a:! const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.5ede67.1 = interface_decl @Foo.loc7 [concrete = constants.%Foo.generic.fda91f.1] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -975,7 +975,7 @@ interface Foo(a:! const (const C)) {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {}
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.decl [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl.loc7: %Foo.type.5ede67.1 = interface_decl @Foo.loc7 [concrete = constants.%Foo.generic.fda91f.1] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
@@ -1123,7 +1123,7 @@ interface Foo(a:! const (const C)) {}
|
||||
// CHECK:STDOUT: %default.import.loc2_30.1 = import <none>
|
||||
// CHECK:STDOUT: %default.import.loc2_30.2 = import <none>
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, imports.%Main.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %D: type = alias_binding D, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %Foo.decl: %Foo.type.5ede67.2 = interface_decl @Foo.loc17 [concrete = constants.%Foo.generic.fda91f.2] {
|
||||
// CHECK:STDOUT: %a.patt: %pattern_type = symbolic_binding_pattern a, 0 [concrete]
|
||||
// CHECK:STDOUT: } {
|
||||
|
||||
@@ -118,7 +118,7 @@ fn F() {
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
// CHECK:STDOUT: %Cpp.ref: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %MyCpp: <namespace> = alias_binding MyCpp, imports.%Cpp [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: %MyCpp: <namespace> = alias_binding MyCpp, %Cpp.ref [concrete = imports.%Cpp]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- api_and_impl.carbon
|
||||
|
||||
@@ -84,13 +84,13 @@ class B(N:! i32) {
|
||||
|
||||
// TODO: Once we allow this, we should produce an "invalid array bound" error
|
||||
// during monomorphization triggered by the C++ code.
|
||||
// CHECK:STDERR: fail_todo_monomorphization_failure.carbon:[[@LINE+4]]:11: error: alias initializer must be a name reference [AliasRequiresNameRef]
|
||||
// CHECK:STDERR: alias T = B(-1);
|
||||
// CHECK:STDERR: ^~~~~
|
||||
// CHECK:STDERR:
|
||||
alias T = B(-1);
|
||||
|
||||
inline Cpp '''
|
||||
// CHECK:STDERR: fail_todo_monomorphization_failure.carbon:[[@LINE+8]]:1: error: semantics TODO: `interop with unsupported type` [SemanticsTodo]
|
||||
// CHECK:STDERR: Carbon::T t;
|
||||
// CHECK:STDERR: ^
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: fail_todo_monomorphization_failure.carbon:[[@LINE+4]]:9: error: no type named 'T' in namespace 'Carbon' [CppInteropParseError]
|
||||
// CHECK:STDERR: 22 | Carbon::T t;
|
||||
// CHECK:STDERR: | ~~~~~~~~^
|
||||
|
||||
+2
-2
@@ -85,7 +85,7 @@ fn D() -> i32 { return C(); }
|
||||
// CHECK:STDOUT: .A = %A.decl
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %NS.ref.loc17: <namespace> = name_ref NS, %NS [concrete = %NS]
|
||||
// CHECK:STDOUT: %ns: <namespace> = alias_binding ns, %NS [concrete = %NS]
|
||||
// CHECK:STDOUT: %ns: <namespace> = alias_binding ns, %NS.ref.loc17 [concrete = %NS]
|
||||
// CHECK:STDOUT: %A.decl: %A.type = fn_decl @A [concrete = constants.%A] {
|
||||
// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern %return.param_patt, %i32 [concrete]
|
||||
@@ -106,7 +106,7 @@ fn D() -> i32 { return C(); }
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %NS.ref.loc23: <namespace> = name_ref NS, %NS [concrete = %NS]
|
||||
// CHECK:STDOUT: %A.ref: %A.type = name_ref A, %A.decl [concrete = constants.%A]
|
||||
// CHECK:STDOUT: %C: %A.type = alias_binding C, %A.decl [concrete = constants.%A]
|
||||
// CHECK:STDOUT: %C: %A.type = alias_binding C, %A.ref [concrete = constants.%A]
|
||||
// CHECK:STDOUT: %D.decl: %D.type = fn_decl @D [concrete = constants.%D] {
|
||||
// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern %return.param_patt, %i32 [concrete]
|
||||
|
||||
@@ -78,7 +78,7 @@ fn ns.A() -> i32 { return 0; }
|
||||
// CHECK:STDOUT: %Core.import = import Core
|
||||
// CHECK:STDOUT: %NS: <namespace> = namespace [concrete] {}
|
||||
// CHECK:STDOUT: %NS.ref: <namespace> = name_ref NS, %NS [concrete = %NS]
|
||||
// CHECK:STDOUT: %ns: <namespace> = alias_binding ns, %NS [concrete = %NS]
|
||||
// CHECK:STDOUT: %ns: <namespace> = alias_binding ns, %NS.ref [concrete = %NS]
|
||||
// CHECK:STDOUT: %A.decl: %A.type = fn_decl @A [concrete = constants.%A] {
|
||||
// CHECK:STDOUT: %return.param_patt: %pattern_type.7ce = out_param_pattern [concrete]
|
||||
// CHECK:STDOUT: %return.patt: %pattern_type.7ce = return_slot_pattern %return.param_patt, %i32 [concrete]
|
||||
|
||||
@@ -905,7 +905,7 @@ alias C = Other.C;
|
||||
// CHECK:STDOUT: %Other.import = import Other
|
||||
// CHECK:STDOUT: %Other.ref: <namespace> = name_ref Other, imports.%Other [concrete = imports.%Other]
|
||||
// CHECK:STDOUT: %C.ref: %C.type = name_ref C, imports.%Other.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %C: %C.type = alias_binding C, imports.%Other.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %C: %C.type = alias_binding C, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C [from "conflict.carbon"];
|
||||
@@ -939,7 +939,7 @@ alias C = Other.C;
|
||||
// CHECK:STDOUT: %Other.import = import Other
|
||||
// CHECK:STDOUT: %Other.ref: <namespace> = name_ref Other, imports.%Other [concrete = imports.%Other]
|
||||
// CHECK:STDOUT: %C.ref: type = name_ref C, imports.%Other.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %C: type = alias_binding C, imports.%Other.C [concrete = constants.%C]
|
||||
// CHECK:STDOUT: %C: type = alias_binding C, %C.ref [concrete = constants.%C]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: class @C [from "export_name.carbon"] {
|
||||
|
||||
+1
-1
@@ -767,7 +767,7 @@ export Poison;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %default.import = import <none>
|
||||
// CHECK:STDOUT: %C.ref: <error> = name_ref C, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %Local: <error> = alias_binding Local, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %Local: <error> = alias_binding Local, %C.ref [concrete = <error>]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- use_non_export_then_base.carbon
|
||||
|
||||
+2
-2
@@ -988,10 +988,10 @@ private export C;
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %default.import = import <none>
|
||||
// CHECK:STDOUT: %C.ref: <error> = name_ref C, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %Local: <error> = alias_binding Local, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %Local: <error> = alias_binding Local, %C.ref [concrete = <error>]
|
||||
// CHECK:STDOUT: %NS.ref: <error> = name_ref NS, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %NSC.ref: <error> = name_ref NSC, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %NSLocal: <error> = alias_binding NSLocal, <error> [concrete = <error>]
|
||||
// CHECK:STDOUT: %NSLocal: <error> = alias_binding NSLocal, %NSC.ref [concrete = <error>]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- repeat_export.carbon
|
||||
|
||||
@@ -547,7 +547,7 @@ CARBON_DIAGNOSTIC_KIND(ClassMemberDeclaration)
|
||||
CARBON_DIAGNOSTIC_KIND(ClassInvalidMemberAccess)
|
||||
|
||||
// Alias diagnostics.
|
||||
CARBON_DIAGNOSTIC_KIND(AliasRequiresNameRef)
|
||||
CARBON_DIAGNOSTIC_KIND(AliasRequiresConstantValue)
|
||||
|
||||
// Where operator and its requirements.
|
||||
CARBON_DIAGNOSTIC_KIND(ImplsOnNonFacetType)
|
||||
|
||||
-64
@@ -1,64 +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
|
||||
//
|
||||
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/int.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/lower/testdata/alias/local.carbon
|
||||
// TIP: To dump output, run:
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/alias/local.carbon
|
||||
|
||||
fn F() -> i32 {
|
||||
var a: i32 = 0;
|
||||
alias b = a;
|
||||
return b;
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: ; ModuleID = 'local.carbon'
|
||||
// CHECK:STDOUT: source_filename = "local.carbon"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define i32 @_CF.Main() #0 !dbg !4 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %a.var = alloca i32, align 4, !dbg !8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %a.var), !dbg !8
|
||||
// CHECK:STDOUT: store i32 0, ptr %a.var, align 4, !dbg !8
|
||||
// CHECK:STDOUT: %.loc16 = load i32, ptr %a.var, align 4, !dbg !9
|
||||
// CHECK:STDOUT: call void @"_COp.7e389eab4a7e5487:core.Destroy.Core"(ptr %a.var), !dbg !8
|
||||
// CHECK:STDOUT: ret i32 %.loc16, !dbg !10
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define weak_odr void @"_COp.7e389eab4a7e5487:core.Destroy.Core"(ptr %self) #0 !dbg !11 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: ret void, !dbg !16
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
|
||||
// CHECK:STDOUT: declare void @llvm.lifetime.start.p0(ptr captures(none)) #1
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
// CHECK:STDOUT: attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !llvm.module.flags = !{!0, !1}
|
||||
// CHECK:STDOUT: !llvm.dbg.cu = !{!2}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !0 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !1 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug)
|
||||
// CHECK:STDOUT: !3 = !DIFile(filename: "local.carbon", directory: "")
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main", scope: null, file: !3, line: 13, type: !5, spFlags: DISPFlagDefinition, unit: !2)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{!7}
|
||||
// CHECK:STDOUT: !7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 14, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 16, column: 10, scope: !4)
|
||||
// CHECK:STDOUT: !10 = !DILocation(line: 16, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !11 = distinct !DISubprogram(name: "Op", linkageName: "_COp.7e389eab4a7e5487:core.Destroy.Core", scope: null, file: !3, line: 14, type: !12, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !14)
|
||||
// CHECK:STDOUT: !12 = !DISubroutineType(types: !13)
|
||||
// CHECK:STDOUT: !13 = !{null, !7}
|
||||
// CHECK:STDOUT: !14 = !{!15}
|
||||
// CHECK:STDOUT: !15 = !DILocalVariable(arg: 1, scope: !11, type: !7)
|
||||
// CHECK:STDOUT: !16 = !DILocation(line: 14, column: 3, scope: !11)
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
// 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-FILE: toolchain/testing/testdata/min_prelude/int.carbon
|
||||
//
|
||||
// AUTOUPDATE
|
||||
// TIP: To test this file alone, run:
|
||||
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/lower/testdata/alias/var.carbon
|
||||
// TIP: To dump output, run:
|
||||
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/lower/testdata/alias/var.carbon
|
||||
|
||||
var a: i32 = 0;
|
||||
|
||||
fn F() -> i32 {
|
||||
alias b = a;
|
||||
return b;
|
||||
}
|
||||
|
||||
// CHECK:STDOUT: ; ModuleID = 'var.carbon'
|
||||
// CHECK:STDOUT: source_filename = "var.carbon"
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: @_Ca.Main = global i32 0
|
||||
// CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @_C__global_init.Main, ptr null }]
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define i32 @_CF.Main() #0 !dbg !4 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc17 = load i32, ptr @_Ca.Main, align 4, !dbg !8
|
||||
// CHECK:STDOUT: ret i32 %.loc17, !dbg !9
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define internal void @_C__global_init.Main() #0 !dbg !10 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: store i32 0, ptr @_Ca.Main, align 4, !dbg !13
|
||||
// CHECK:STDOUT: ret void, !dbg !14
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: attributes #0 = { nounwind }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !llvm.module.flags = !{!0, !1}
|
||||
// CHECK:STDOUT: !llvm.dbg.cu = !{!2}
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: !0 = !{i32 7, !"Dwarf Version", i32 5}
|
||||
// CHECK:STDOUT: !1 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
// CHECK:STDOUT: !2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "carbon", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug)
|
||||
// CHECK:STDOUT: !3 = !DIFile(filename: "var.carbon", directory: "")
|
||||
// CHECK:STDOUT: !4 = distinct !DISubprogram(name: "F", linkageName: "_CF.Main", scope: null, file: !3, line: 15, type: !5, spFlags: DISPFlagDefinition, unit: !2)
|
||||
// CHECK:STDOUT: !5 = !DISubroutineType(types: !6)
|
||||
// CHECK:STDOUT: !6 = !{!7}
|
||||
// CHECK:STDOUT: !7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
// CHECK:STDOUT: !8 = !DILocation(line: 17, column: 10, scope: !4)
|
||||
// CHECK:STDOUT: !9 = !DILocation(line: 17, column: 3, scope: !4)
|
||||
// CHECK:STDOUT: !10 = distinct !DISubprogram(name: "__global_init", linkageName: "_C__global_init.Main", scope: null, file: !3, type: !11, spFlags: DISPFlagDefinition, unit: !2)
|
||||
// CHECK:STDOUT: !11 = !DISubroutineType(types: !12)
|
||||
// CHECK:STDOUT: !12 = !{null}
|
||||
// CHECK:STDOUT: !13 = !DILocation(line: 13, column: 1, scope: !10)
|
||||
// CHECK:STDOUT: !14 = !DILocation(line: 0, scope: !10)
|
||||
Reference in New Issue
Block a user