mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 22:02:52 +01:00
Implement merging of conflicts found during import. (#3819)
Note we only identify conflicts between libraries in the current package during import. This restructures the BUILD because of dependency cycles between cpp files... We're going to need context's name lookup to handle things such as merging, merging requires function logic, function logic requires context access. Per discussion, going with a single large cc_library for now rather than trying to split out small libraries. I'm envisioning the new merge.* as a hub for cross-declaration merge logic. Note function.cpp is already pretty sizable, and I think it may lean a little function-specific even if there are some utilities that could be split out.
This commit is contained in:
@@ -61,7 +61,7 @@ class C {
|
||||
// CHECK:STDOUT: %F: <function> = fn_decl @F [template] {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @F();
|
||||
// CHECK:STDOUT: extern fn @F();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_redecl.carbon
|
||||
// CHECK:STDOUT:
|
||||
@@ -73,7 +73,7 @@ class C {
|
||||
// CHECK:STDOUT: %F.loc12: <function> = fn_decl @F [template] {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @F();
|
||||
// CHECK:STDOUT: extern fn @F();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_redecl_extern.carbon
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+109
-196
@@ -73,63 +73,11 @@ var b: i32 = B(1);
|
||||
var c: {.c: i32} = C((1,));
|
||||
var d: () = D();
|
||||
|
||||
// --- fail_todo_merge.carbon
|
||||
// --- merge.carbon
|
||||
|
||||
library "merge" api;
|
||||
|
||||
import library "api";
|
||||
// CHECK:STDERR: fail_todo_merge.carbon:[[@LINE+52]]:1: In import.
|
||||
// CHECK:STDERR: import library "extern_api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: extern_api.carbon:4:1: ERROR: Duplicate name being declared in the same scope.
|
||||
// CHECK:STDERR: extern fn A();
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~
|
||||
// CHECK:STDERR: fail_todo_merge.carbon:[[@LINE-7]]:1: In import.
|
||||
// CHECK:STDERR: import library "api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: api.carbon:4:1: Name is previously declared here.
|
||||
// CHECK:STDERR: fn A();
|
||||
// CHECK:STDERR: ^~~~~~~
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: fail_todo_merge.carbon:[[@LINE+39]]:1: In import.
|
||||
// CHECK:STDERR: import library "extern_api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: extern_api.carbon:5:1: ERROR: Duplicate name being declared in the same scope.
|
||||
// CHECK:STDERR: extern fn B(b: i32) -> i32;
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// CHECK:STDERR: fail_todo_merge.carbon:[[@LINE-20]]:1: In import.
|
||||
// CHECK:STDERR: import library "api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: api.carbon:5:1: Name is previously declared here.
|
||||
// CHECK:STDERR: fn B(b: i32) -> i32;
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: fail_todo_merge.carbon:[[@LINE+26]]:1: In import.
|
||||
// CHECK:STDERR: import library "extern_api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: extern_api.carbon:6:1: ERROR: Duplicate name being declared in the same scope.
|
||||
// CHECK:STDERR: extern fn C(c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// CHECK:STDERR: fail_todo_merge.carbon:[[@LINE-33]]:1: In import.
|
||||
// CHECK:STDERR: import library "api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: api.carbon:6:1: Name is previously declared here.
|
||||
// CHECK:STDERR: fn C(c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: fail_todo_merge.carbon:[[@LINE+13]]:1: In import.
|
||||
// CHECK:STDERR: import library "extern_api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: extern_api.carbon:7:1: ERROR: Duplicate name being declared in the same scope.
|
||||
// CHECK:STDERR: extern fn D();
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~
|
||||
// CHECK:STDERR: fail_todo_merge.carbon:[[@LINE-46]]:1: In import.
|
||||
// CHECK:STDERR: import library "api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: api.carbon:7:1: Name is previously declared here.
|
||||
// CHECK:STDERR: extern fn D();
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~
|
||||
// CHECK:STDERR:
|
||||
import library "extern_api";
|
||||
|
||||
var a: () = A();
|
||||
@@ -137,62 +85,11 @@ var b: i32 = B(1);
|
||||
var c: {.c: i32} = C((1,));
|
||||
var d: () = D();
|
||||
|
||||
// --- fail_todo_merge_reverse.carbon
|
||||
// --- merge_reverse.carbon
|
||||
|
||||
library "merge_reverse" api;
|
||||
|
||||
import library "extern_api";
|
||||
// CHECK:STDERR: fail_todo_merge_reverse.carbon:[[@LINE+51]]:1: In import.
|
||||
// CHECK:STDERR: import library "api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: api.carbon:4:1: ERROR: Duplicate name being declared in the same scope.
|
||||
// CHECK:STDERR: fn A();
|
||||
// CHECK:STDERR: ^~~~~~~
|
||||
// CHECK:STDERR: fail_todo_merge_reverse.carbon:[[@LINE-7]]:1: In import.
|
||||
// CHECK:STDERR: import library "extern_api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: extern_api.carbon:4:1: Name is previously declared here.
|
||||
// CHECK:STDERR: extern fn A();
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: fail_todo_merge_reverse.carbon:[[@LINE+38]]:1: In import.
|
||||
// CHECK:STDERR: import library "api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: api.carbon:5:1: ERROR: Duplicate name being declared in the same scope.
|
||||
// CHECK:STDERR: fn B(b: i32) -> i32;
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~
|
||||
// CHECK:STDERR: fail_todo_merge_reverse.carbon:[[@LINE-20]]:1: In import.
|
||||
// CHECK:STDERR: import library "extern_api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: extern_api.carbon:5:1: Name is previously declared here.
|
||||
// CHECK:STDERR: extern fn B(b: i32) -> i32;
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: fail_todo_merge_reverse.carbon:[[@LINE+25]]:1: In import.
|
||||
// CHECK:STDERR: import library "api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: api.carbon:6:1: ERROR: Duplicate name being declared in the same scope.
|
||||
// CHECK:STDERR: fn C(c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// CHECK:STDERR: fail_todo_merge_reverse.carbon:[[@LINE-33]]:1: In import.
|
||||
// CHECK:STDERR: import library "extern_api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: extern_api.carbon:6:1: Name is previously declared here.
|
||||
// CHECK:STDERR: extern fn C(c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
// CHECK:STDERR:
|
||||
// CHECK:STDERR: fail_todo_merge_reverse.carbon:[[@LINE+12]]:1: In import.
|
||||
// CHECK:STDERR: import library "api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: api.carbon:7:1: ERROR: Duplicate name being declared in the same scope.
|
||||
// CHECK:STDERR: extern fn D();
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~
|
||||
// CHECK:STDERR: fail_todo_merge_reverse.carbon:[[@LINE-46]]:1: In import.
|
||||
// CHECK:STDERR: import library "extern_api";
|
||||
// CHECK:STDERR: ^~~~~~
|
||||
// CHECK:STDERR: extern_api.carbon:7:1: Name is previously declared here.
|
||||
// CHECK:STDERR: extern fn D();
|
||||
// CHECK:STDERR: ^~~~~~~~~~~~~~
|
||||
import library "api";
|
||||
|
||||
var a: () = A();
|
||||
@@ -238,7 +135,7 @@ var d: () = D();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @D();
|
||||
// CHECK:STDOUT: extern fn @D();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- extern_api.carbon
|
||||
// CHECK:STDOUT:
|
||||
@@ -272,13 +169,13 @@ var d: () = D();
|
||||
// CHECK:STDOUT: %D: <function> = fn_decl @D [template] {}
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @A();
|
||||
// CHECK:STDOUT: extern fn @A();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @B(%b: i32) -> i32;
|
||||
// CHECK:STDOUT: extern fn @B(%b: i32) -> i32;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT: extern fn @C(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @D();
|
||||
// CHECK:STDOUT: extern fn @D();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- basics.carbon
|
||||
// CHECK:STDOUT:
|
||||
@@ -326,7 +223,7 @@ var d: () = D();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @D();
|
||||
// CHECK:STDOUT: extern fn @D();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -412,7 +309,7 @@ var d: () = D();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @D();
|
||||
// CHECK:STDOUT: extern fn @D();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -492,13 +389,13 @@ var d: () = D();
|
||||
// CHECK:STDOUT: %d: ref () = bind_name d, %d.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @A();
|
||||
// CHECK:STDOUT: extern fn @A();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @B(%b: i32) -> i32;
|
||||
// CHECK:STDOUT: extern fn @B(%b: i32) -> i32;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT: extern fn @C(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @D();
|
||||
// CHECK:STDOUT: extern fn @D();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
@@ -522,14 +419,14 @@ var d: () = D();
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_todo_merge.carbon
|
||||
// CHECK:STDOUT: --- merge.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %.1: type = tuple_type () [template]
|
||||
// CHECK:STDOUT: %.2: i32 = int_literal 1 [template]
|
||||
// CHECK:STDOUT: %.3: type = struct_type {.c: i32} [template]
|
||||
// CHECK:STDOUT: %.4: type = tuple_type (i32) [template]
|
||||
// CHECK:STDOUT: %.5: (i32,) = tuple_value (%.2) [template]
|
||||
// CHECK:STDOUT: %.1: type = tuple_type (i32) [template]
|
||||
// CHECK:STDOUT: %.2: type = struct_type {.c: i32} [template]
|
||||
// CHECK:STDOUT: %.3: type = tuple_type () [template]
|
||||
// CHECK:STDOUT: %.4: i32 = int_literal 1 [template]
|
||||
// CHECK:STDOUT: %.5: (i32,) = tuple_value (%.4) [template]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
@@ -543,67 +440,75 @@ var d: () = D();
|
||||
// CHECK:STDOUT: .c = %c
|
||||
// CHECK:STDOUT: .d = %d
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %import_ref.1: <function> = import_ref ir1, inst+1, used [template = imports.%A]
|
||||
// CHECK:STDOUT: %import_ref.2: <function> = import_ref ir1, inst+5, used [template = imports.%B]
|
||||
// CHECK:STDOUT: %import_ref.3: <function> = import_ref ir1, inst+17, used [template = imports.%C]
|
||||
// CHECK:STDOUT: %import_ref.4: <function> = import_ref ir1, inst+18, used [template = imports.%D]
|
||||
// CHECK:STDOUT: %import_ref.5 = import_ref ir2, inst+1, unused
|
||||
// CHECK:STDOUT: %import_ref.6 = import_ref ir2, inst+5, unused
|
||||
// CHECK:STDOUT: %import_ref.7 = import_ref ir2, inst+17, unused
|
||||
// CHECK:STDOUT: %import_ref.8 = import_ref ir2, inst+18, unused
|
||||
// CHECK:STDOUT: %.loc59_9.1: () = tuple_literal ()
|
||||
// CHECK:STDOUT: %.loc59_9.2: type = converted %.loc59_9.1, constants.%.1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %import_ref.1: <function> = import_ref ir1, inst+1, used [template = imports.%A.1]
|
||||
// CHECK:STDOUT: %import_ref.2: <function> = import_ref ir1, inst+5, used [template = imports.%B.1]
|
||||
// CHECK:STDOUT: %import_ref.3: <function> = import_ref ir1, inst+17, used [template = imports.%C.1]
|
||||
// CHECK:STDOUT: %import_ref.4: <function> = import_ref ir1, inst+18, used [template = imports.%D.1]
|
||||
// CHECK:STDOUT: %import_ref.5: <function> = import_ref ir2, inst+1, used [template = imports.%A.2]
|
||||
// CHECK:STDOUT: %import_ref.6: <function> = import_ref ir2, inst+5, used [template = imports.%B.2]
|
||||
// CHECK:STDOUT: %import_ref.7: <function> = import_ref ir2, inst+17, used [template = imports.%C.2]
|
||||
// CHECK:STDOUT: %import_ref.8: <function> = import_ref ir2, inst+18, used [template = imports.%D.2]
|
||||
// CHECK:STDOUT: %.loc7_9.1: () = tuple_literal ()
|
||||
// CHECK:STDOUT: %.loc7_9.2: type = converted %.loc7_9.1, constants.%.3 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %a.var: ref () = var a
|
||||
// CHECK:STDOUT: %a: ref () = bind_name a, %a.var
|
||||
// CHECK:STDOUT: %b.var: ref i32 = var b
|
||||
// CHECK:STDOUT: %b: ref i32 = bind_name b, %b.var
|
||||
// CHECK:STDOUT: %.loc61: type = struct_type {.c: i32} [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc9: type = struct_type {.c: i32} [template = constants.%.2]
|
||||
// CHECK:STDOUT: %c.var: ref {.c: i32} = var c
|
||||
// CHECK:STDOUT: %c: ref {.c: i32} = bind_name c, %c.var
|
||||
// CHECK:STDOUT: %.loc62_9.1: () = tuple_literal ()
|
||||
// CHECK:STDOUT: %.loc62_9.2: type = converted %.loc62_9.1, constants.%.1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc10_9.1: () = tuple_literal ()
|
||||
// CHECK:STDOUT: %.loc10_9.2: type = converted %.loc10_9.1, constants.%.3 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %d.var: ref () = var d
|
||||
// CHECK:STDOUT: %d: ref () = bind_name d, %d.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @A();
|
||||
// CHECK:STDOUT: extern fn @A.1();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @B(%b: i32) -> i32;
|
||||
// CHECK:STDOUT: fn @A.2();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT: extern fn @B.1(%b: i32) -> i32;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @D();
|
||||
// CHECK:STDOUT: fn @B.2(%b: i32) -> i32;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: extern fn @C.1(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C.2(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: extern fn @D.1();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: extern fn @D.2();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %A.ref: <function> = name_ref A, file.%import_ref.1 [template = imports.%A]
|
||||
// CHECK:STDOUT: %.loc59: init () = call %A.ref()
|
||||
// CHECK:STDOUT: assign file.%a.var, %.loc59
|
||||
// CHECK:STDOUT: %B.ref: <function> = name_ref B, file.%import_ref.2 [template = imports.%B]
|
||||
// CHECK:STDOUT: %.loc60_16: i32 = int_literal 1 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc60_15: init i32 = call %B.ref(%.loc60_16)
|
||||
// CHECK:STDOUT: assign file.%b.var, %.loc60_15
|
||||
// CHECK:STDOUT: %C.ref: <function> = name_ref C, file.%import_ref.3 [template = imports.%C]
|
||||
// CHECK:STDOUT: %.loc61_23: i32 = int_literal 1 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc61_25.1: (i32,) = tuple_literal (%.loc61_23)
|
||||
// CHECK:STDOUT: %.loc61_25.2: (i32,) = tuple_value (%.loc61_23) [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc61_25.3: (i32,) = converted %.loc61_25.1, %.loc61_25.2 [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc61_21: init {.c: i32} = call %C.ref(%.loc61_25.3)
|
||||
// CHECK:STDOUT: assign file.%c.var, %.loc61_21
|
||||
// CHECK:STDOUT: %D.ref: <function> = name_ref D, file.%import_ref.4 [template = imports.%D]
|
||||
// CHECK:STDOUT: %.loc62: init () = call %D.ref()
|
||||
// CHECK:STDOUT: assign file.%d.var, %.loc62
|
||||
// CHECK:STDOUT: %A.ref: <function> = name_ref A, file.%import_ref.1 [template = imports.%A.1]
|
||||
// CHECK:STDOUT: %.loc7: init () = call %A.ref()
|
||||
// CHECK:STDOUT: assign file.%a.var, %.loc7
|
||||
// CHECK:STDOUT: %B.ref: <function> = name_ref B, file.%import_ref.2 [template = imports.%B.1]
|
||||
// CHECK:STDOUT: %.loc8_16: i32 = int_literal 1 [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc8_15: init i32 = call %B.ref(%.loc8_16)
|
||||
// CHECK:STDOUT: assign file.%b.var, %.loc8_15
|
||||
// CHECK:STDOUT: %C.ref: <function> = name_ref C, file.%import_ref.3 [template = imports.%C.1]
|
||||
// CHECK:STDOUT: %.loc9_23: i32 = int_literal 1 [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc9_25.1: (i32,) = tuple_literal (%.loc9_23)
|
||||
// CHECK:STDOUT: %.loc9_25.2: (i32,) = tuple_value (%.loc9_23) [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc9_25.3: (i32,) = converted %.loc9_25.1, %.loc9_25.2 [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc9_21: init {.c: i32} = call %C.ref(%.loc9_25.3)
|
||||
// CHECK:STDOUT: assign file.%c.var, %.loc9_21
|
||||
// CHECK:STDOUT: %D.ref: <function> = name_ref D, file.%import_ref.4 [template = imports.%D.1]
|
||||
// CHECK:STDOUT: %.loc10: init () = call %D.ref()
|
||||
// CHECK:STDOUT: assign file.%d.var, %.loc10
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: --- fail_todo_merge_reverse.carbon
|
||||
// CHECK:STDOUT: --- merge_reverse.carbon
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: constants {
|
||||
// CHECK:STDOUT: %.1: type = tuple_type () [template]
|
||||
// CHECK:STDOUT: %.2: i32 = int_literal 1 [template]
|
||||
// CHECK:STDOUT: %.3: type = struct_type {.c: i32} [template]
|
||||
// CHECK:STDOUT: %.4: type = tuple_type (i32) [template]
|
||||
// CHECK:STDOUT: %.5: (i32,) = tuple_value (%.2) [template]
|
||||
// CHECK:STDOUT: %.1: type = tuple_type (i32) [template]
|
||||
// CHECK:STDOUT: %.2: type = struct_type {.c: i32} [template]
|
||||
// CHECK:STDOUT: %.3: type = tuple_type () [template]
|
||||
// CHECK:STDOUT: %.4: i32 = int_literal 1 [template]
|
||||
// CHECK:STDOUT: %.5: (i32,) = tuple_value (%.4) [template]
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: file {
|
||||
@@ -617,56 +522,64 @@ var d: () = D();
|
||||
// CHECK:STDOUT: .c = %c
|
||||
// CHECK:STDOUT: .d = %d
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT: %import_ref.1: <function> = import_ref ir1, inst+1, used [template = imports.%A]
|
||||
// CHECK:STDOUT: %import_ref.2: <function> = import_ref ir1, inst+5, used [template = imports.%B]
|
||||
// CHECK:STDOUT: %import_ref.3: <function> = import_ref ir1, inst+17, used [template = imports.%C]
|
||||
// CHECK:STDOUT: %import_ref.4: <function> = import_ref ir1, inst+18, used [template = imports.%D]
|
||||
// CHECK:STDOUT: %import_ref.5 = import_ref ir2, inst+1, unused
|
||||
// CHECK:STDOUT: %import_ref.6 = import_ref ir2, inst+5, unused
|
||||
// CHECK:STDOUT: %import_ref.7 = import_ref ir2, inst+17, unused
|
||||
// CHECK:STDOUT: %import_ref.8 = import_ref ir2, inst+18, unused
|
||||
// CHECK:STDOUT: %.loc58_9.1: () = tuple_literal ()
|
||||
// CHECK:STDOUT: %.loc58_9.2: type = converted %.loc58_9.1, constants.%.1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %import_ref.1: <function> = import_ref ir1, inst+1, used [template = imports.%A.1]
|
||||
// CHECK:STDOUT: %import_ref.2: <function> = import_ref ir1, inst+5, used [template = imports.%B.1]
|
||||
// CHECK:STDOUT: %import_ref.3: <function> = import_ref ir1, inst+17, used [template = imports.%C.1]
|
||||
// CHECK:STDOUT: %import_ref.4: <function> = import_ref ir1, inst+18, used [template = imports.%D.1]
|
||||
// CHECK:STDOUT: %import_ref.5: <function> = import_ref ir2, inst+1, used [template = imports.%A.2]
|
||||
// CHECK:STDOUT: %import_ref.6: <function> = import_ref ir2, inst+5, used [template = imports.%B.2]
|
||||
// CHECK:STDOUT: %import_ref.7: <function> = import_ref ir2, inst+17, used [template = imports.%C.2]
|
||||
// CHECK:STDOUT: %import_ref.8: <function> = import_ref ir2, inst+18, used [template = imports.%D.2]
|
||||
// CHECK:STDOUT: %.loc7_9.1: () = tuple_literal ()
|
||||
// CHECK:STDOUT: %.loc7_9.2: type = converted %.loc7_9.1, constants.%.3 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %a.var: ref () = var a
|
||||
// CHECK:STDOUT: %a: ref () = bind_name a, %a.var
|
||||
// CHECK:STDOUT: %b.var: ref i32 = var b
|
||||
// CHECK:STDOUT: %b: ref i32 = bind_name b, %b.var
|
||||
// CHECK:STDOUT: %.loc60: type = struct_type {.c: i32} [template = constants.%.3]
|
||||
// CHECK:STDOUT: %.loc9: type = struct_type {.c: i32} [template = constants.%.2]
|
||||
// CHECK:STDOUT: %c.var: ref {.c: i32} = var c
|
||||
// CHECK:STDOUT: %c: ref {.c: i32} = bind_name c, %c.var
|
||||
// CHECK:STDOUT: %.loc61_9.1: () = tuple_literal ()
|
||||
// CHECK:STDOUT: %.loc61_9.2: type = converted %.loc61_9.1, constants.%.1 [template = constants.%.1]
|
||||
// CHECK:STDOUT: %.loc10_9.1: () = tuple_literal ()
|
||||
// CHECK:STDOUT: %.loc10_9.2: type = converted %.loc10_9.1, constants.%.3 [template = constants.%.3]
|
||||
// CHECK:STDOUT: %d.var: ref () = var d
|
||||
// CHECK:STDOUT: %d: ref () = bind_name d, %d.var
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @A();
|
||||
// CHECK:STDOUT: fn @A.1();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @B(%b: i32) -> i32;
|
||||
// CHECK:STDOUT: fn @A.2();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT: fn @B.1(%b: i32) -> i32;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @D();
|
||||
// CHECK:STDOUT: fn @B.2(%b: i32) -> i32;
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C.1(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @C.2(%c: (i32,)) -> {.c: i32};
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: extern fn @D.1();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: extern fn @D.2();
|
||||
// CHECK:STDOUT:
|
||||
// CHECK:STDOUT: fn @__global_init() {
|
||||
// CHECK:STDOUT: !entry:
|
||||
// CHECK:STDOUT: %A.ref: <function> = name_ref A, file.%import_ref.1 [template = imports.%A]
|
||||
// CHECK:STDOUT: %.loc58: init () = call %A.ref()
|
||||
// CHECK:STDOUT: assign file.%a.var, %.loc58
|
||||
// CHECK:STDOUT: %B.ref: <function> = name_ref B, file.%import_ref.2 [template = imports.%B]
|
||||
// CHECK:STDOUT: %.loc59_16: i32 = int_literal 1 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc59_15: init i32 = call %B.ref(%.loc59_16)
|
||||
// CHECK:STDOUT: assign file.%b.var, %.loc59_15
|
||||
// CHECK:STDOUT: %C.ref: <function> = name_ref C, file.%import_ref.3 [template = imports.%C]
|
||||
// CHECK:STDOUT: %.loc60_23: i32 = int_literal 1 [template = constants.%.2]
|
||||
// CHECK:STDOUT: %.loc60_25.1: (i32,) = tuple_literal (%.loc60_23)
|
||||
// CHECK:STDOUT: %.loc60_25.2: (i32,) = tuple_value (%.loc60_23) [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc60_25.3: (i32,) = converted %.loc60_25.1, %.loc60_25.2 [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc60_21: init {.c: i32} = call %C.ref(%.loc60_25.3)
|
||||
// CHECK:STDOUT: assign file.%c.var, %.loc60_21
|
||||
// CHECK:STDOUT: %D.ref: <function> = name_ref D, file.%import_ref.4 [template = imports.%D]
|
||||
// CHECK:STDOUT: %.loc61: init () = call %D.ref()
|
||||
// CHECK:STDOUT: assign file.%d.var, %.loc61
|
||||
// CHECK:STDOUT: %A.ref: <function> = name_ref A, file.%import_ref.1 [template = imports.%A.1]
|
||||
// CHECK:STDOUT: %.loc7: init () = call %A.ref()
|
||||
// CHECK:STDOUT: assign file.%a.var, %.loc7
|
||||
// CHECK:STDOUT: %B.ref: <function> = name_ref B, file.%import_ref.2 [template = imports.%B.1]
|
||||
// CHECK:STDOUT: %.loc8_16: i32 = int_literal 1 [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc8_15: init i32 = call %B.ref(%.loc8_16)
|
||||
// CHECK:STDOUT: assign file.%b.var, %.loc8_15
|
||||
// CHECK:STDOUT: %C.ref: <function> = name_ref C, file.%import_ref.3 [template = imports.%C.1]
|
||||
// CHECK:STDOUT: %.loc9_23: i32 = int_literal 1 [template = constants.%.4]
|
||||
// CHECK:STDOUT: %.loc9_25.1: (i32,) = tuple_literal (%.loc9_23)
|
||||
// CHECK:STDOUT: %.loc9_25.2: (i32,) = tuple_value (%.loc9_23) [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc9_25.3: (i32,) = converted %.loc9_25.1, %.loc9_25.2 [template = constants.%.5]
|
||||
// CHECK:STDOUT: %.loc9_21: init {.c: i32} = call %C.ref(%.loc9_25.3)
|
||||
// CHECK:STDOUT: assign file.%c.var, %.loc9_21
|
||||
// CHECK:STDOUT: %D.ref: <function> = name_ref D, file.%import_ref.4 [template = imports.%D.1]
|
||||
// CHECK:STDOUT: %.loc10: init () = call %D.ref()
|
||||
// CHECK:STDOUT: assign file.%d.var, %.loc10
|
||||
// CHECK:STDOUT: return
|
||||
// CHECK:STDOUT: }
|
||||
// CHECK:STDOUT:
|
||||
|
||||
Reference in New Issue
Block a user