|
|
@@ -6,10 +6,31 @@
|
|
|
|
|
|
class Class;
|
|
|
|
|
|
+// CHECK:STDERR: fail_incomplete.carbon:[[@LINE+6]]:4: ERROR: Cannot declare a member of incomplete class `Class`.
|
|
|
+// CHECK:STDERR: fn Class.Function() {}
|
|
|
+// CHECK:STDERR: ^
|
|
|
+// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-5]]:1: Class was forward declared here.
|
|
|
+// CHECK:STDERR: class Class;
|
|
|
+// CHECK:STDERR: ^
|
|
|
+fn Class.Function() {}
|
|
|
+
|
|
|
+fn CallClassFunction() {
|
|
|
+ // CHECK:STDERR: fail_incomplete.carbon:[[@LINE+9]]:3: ERROR: Member access into incomplete class `Class`.
|
|
|
+ // CHECK:STDERR: Class.Function();
|
|
|
+ // CHECK:STDERR: ^
|
|
|
+ // CHECK:STDERR: fail_incomplete.carbon:[[@LINE-14]]:1: Class was forward declared here.
|
|
|
+ // CHECK:STDERR: class Class;
|
|
|
+ // CHECK:STDERR: ^
|
|
|
+ // CHECK:STDERR: fail_incomplete.carbon:[[@LINE+3]]:18: ERROR: Semantics TODO: `Not a callable name`.
|
|
|
+ // CHECK:STDERR: Class.Function();
|
|
|
+ // CHECK:STDERR: ^
|
|
|
+ Class.Function();
|
|
|
+}
|
|
|
+
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE+6]]:17: ERROR: Variable has incomplete type `Class`.
|
|
|
// CHECK:STDERR: var global_var: Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
-// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-5]]:1: Class was forward declared here.
|
|
|
+// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-26]]:1: Class was forward declared here.
|
|
|
// CHECK:STDERR: class Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
var global_var: Class;
|
|
|
@@ -17,7 +38,7 @@ var global_var: Class;
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE+6]]:24: ERROR: Function returns incomplete type `Class`.
|
|
|
// CHECK:STDERR: fn ConvertFromStruct() -> Class { return {}; }
|
|
|
// CHECK:STDERR: ^
|
|
|
-// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-13]]:1: Class was forward declared here.
|
|
|
+// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-34]]:1: Class was forward declared here.
|
|
|
// CHECK:STDERR: class Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
fn ConvertFromStruct() -> Class { return {}; }
|
|
|
@@ -31,7 +52,7 @@ fn MemberAccess(p: Class*) -> i32 {
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE+6]]:11: ERROR: Invalid use of incomplete type `Class`.
|
|
|
// CHECK:STDERR: return (*p).n;
|
|
|
// CHECK:STDERR: ^
|
|
|
- // CHECK:STDERR: fail_incomplete.carbon:[[@LINE-27]]:1: Class was forward declared here.
|
|
|
+ // CHECK:STDERR: fail_incomplete.carbon:[[@LINE-48]]:1: Class was forward declared here.
|
|
|
// CHECK:STDERR: class Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
return (*p).n;
|
|
|
@@ -40,7 +61,7 @@ fn MemberAccess(p: Class*) -> i32 {
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE+6]]:20: ERROR: Function returns incomplete type `Class`.
|
|
|
// CHECK:STDERR: fn Copy(p: Class*) -> Class {
|
|
|
// CHECK:STDERR: ^
|
|
|
-// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-36]]:1: Class was forward declared here.
|
|
|
+// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-57]]:1: Class was forward declared here.
|
|
|
// CHECK:STDERR: class Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
fn Copy(p: Class*) -> Class {
|
|
|
@@ -51,7 +72,7 @@ fn Let(p: Class*) {
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE+6]]:10: ERROR: `let` binding has incomplete type `Class`.
|
|
|
// CHECK:STDERR: let c: Class = *p;
|
|
|
// CHECK:STDERR: ^
|
|
|
- // CHECK:STDERR: fail_incomplete.carbon:[[@LINE-47]]:1: Class was forward declared here.
|
|
|
+ // CHECK:STDERR: fail_incomplete.carbon:[[@LINE-68]]:1: Class was forward declared here.
|
|
|
// CHECK:STDERR: class Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
let c: Class = *p;
|
|
|
@@ -64,7 +85,7 @@ fn TakeIncomplete(c: Class);
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE+6]]:23: ERROR: Function returns incomplete type `Class`.
|
|
|
// CHECK:STDERR: fn ReturnIncomplete() -> Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
-// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-60]]:1: Class was forward declared here.
|
|
|
+// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-81]]:1: Class was forward declared here.
|
|
|
// CHECK:STDERR: class Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
fn ReturnIncomplete() -> Class;
|
|
|
@@ -73,7 +94,7 @@ fn CallTakeIncomplete(p: Class*) {
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE+9]]:17: ERROR: Forming value of incomplete type `Class`.
|
|
|
// CHECK:STDERR: TakeIncomplete(*p);
|
|
|
// CHECK:STDERR: ^
|
|
|
- // CHECK:STDERR: fail_incomplete.carbon:[[@LINE-69]]:1: Class was forward declared here.
|
|
|
+ // CHECK:STDERR: fail_incomplete.carbon:[[@LINE-90]]:1: Class was forward declared here.
|
|
|
// CHECK:STDERR: class Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-19]]:1: Initializing parameter 1 of function declared here.
|
|
|
@@ -84,7 +105,7 @@ fn CallTakeIncomplete(p: Class*) {
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE+9]]:17: ERROR: Forming value of incomplete type `Class`.
|
|
|
// CHECK:STDERR: TakeIncomplete({});
|
|
|
// CHECK:STDERR: ^
|
|
|
- // CHECK:STDERR: fail_incomplete.carbon:[[@LINE-80]]:1: Class was forward declared here.
|
|
|
+ // CHECK:STDERR: fail_incomplete.carbon:[[@LINE-101]]:1: Class was forward declared here.
|
|
|
// CHECK:STDERR: class Class;
|
|
|
// CHECK:STDERR: ^
|
|
|
// CHECK:STDERR: fail_incomplete.carbon:[[@LINE-30]]:1: Initializing parameter 1 of function declared here.
|
|
|
@@ -98,7 +119,9 @@ fn CallReturnIncomplete() {
|
|
|
}
|
|
|
|
|
|
// CHECK:STDOUT: file "fail_incomplete.carbon" {
|
|
|
-// CHECK:STDOUT: %Class: type = class_declaration @Class
|
|
|
+// CHECK:STDOUT: %Class: type = class_declaration @Class, ()
|
|
|
+// CHECK:STDOUT: %.loc15: <function> = fn_decl @.1
|
|
|
+// CHECK:STDOUT: %CallClassFunction: <function> = fn_decl @CallClassFunction
|
|
|
// CHECK:STDOUT: %Class.ref: type = name_reference "Class", %Class
|
|
|
// CHECK:STDOUT: %global_var: ref <error> = var "global_var"
|
|
|
// CHECK:STDOUT: %ConvertFromStruct: <function> = fn_decl @ConvertFromStruct
|
|
|
@@ -113,24 +136,36 @@ fn CallReturnIncomplete() {
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: class @Class;
|
|
|
// CHECK:STDOUT:
|
|
|
+// CHECK:STDOUT: fn @.1() {
|
|
|
+// CHECK:STDOUT: !entry:
|
|
|
+// CHECK:STDOUT: return
|
|
|
+// CHECK:STDOUT: }
|
|
|
+// CHECK:STDOUT:
|
|
|
+// CHECK:STDOUT: fn @CallClassFunction() {
|
|
|
+// CHECK:STDOUT: !entry:
|
|
|
+// CHECK:STDOUT: %Class.ref: type = name_reference "Class", package.%Class
|
|
|
+// CHECK:STDOUT: %Function.ref: <error> = name_reference "Function", <error>
|
|
|
+// CHECK:STDOUT: return
|
|
|
+// CHECK:STDOUT: }
|
|
|
+// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: fn @ConvertFromStruct() -> <error> {
|
|
|
// CHECK:STDOUT: !entry:
|
|
|
-// CHECK:STDOUT: %.loc23_43.1: type = struct_type {}
|
|
|
-// CHECK:STDOUT: %.loc23_43.2: {} = struct_literal ()
|
|
|
+// CHECK:STDOUT: %.loc44_43.1: type = struct_type {}
|
|
|
+// CHECK:STDOUT: %.loc44_43.2: {} = struct_literal ()
|
|
|
// CHECK:STDOUT: return <error>
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: fn @MemberAccess(%p: Class*) -> i32 {
|
|
|
// CHECK:STDOUT: !entry:
|
|
|
// CHECK:STDOUT: %p.ref: Class* = name_reference "p", %p
|
|
|
-// CHECK:STDOUT: %.loc37: ref Class = dereference %p.ref
|
|
|
+// CHECK:STDOUT: %.loc58: ref Class = dereference %p.ref
|
|
|
// CHECK:STDOUT: return <error>
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: fn @Copy(%p: Class*) -> <error> {
|
|
|
// CHECK:STDOUT: !entry:
|
|
|
// CHECK:STDOUT: %p.ref: Class* = name_reference "p", %p
|
|
|
-// CHECK:STDOUT: %.loc47: ref Class = dereference %p.ref
|
|
|
+// CHECK:STDOUT: %.loc68: ref Class = dereference %p.ref
|
|
|
// CHECK:STDOUT: return <error>
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
@@ -138,7 +173,7 @@ fn CallReturnIncomplete() {
|
|
|
// CHECK:STDOUT: !entry:
|
|
|
// CHECK:STDOUT: %Class.ref: type = name_reference "Class", package.%Class
|
|
|
// CHECK:STDOUT: %p.ref: Class* = name_reference "p", %p
|
|
|
-// CHECK:STDOUT: %.loc57: ref Class = dereference %p.ref
|
|
|
+// CHECK:STDOUT: %.loc78: ref Class = dereference %p.ref
|
|
|
// CHECK:STDOUT: %c: <error> = bind_name "c", <error>
|
|
|
// CHECK:STDOUT: return
|
|
|
// CHECK:STDOUT: }
|
|
|
@@ -149,18 +184,18 @@ fn CallReturnIncomplete() {
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: fn @CallTakeIncomplete(%p: Class*) {
|
|
|
// CHECK:STDOUT: !entry:
|
|
|
-// CHECK:STDOUT: %TakeIncomplete.ref.loc82: <function> = name_reference "TakeIncomplete", package.%TakeIncomplete
|
|
|
+// CHECK:STDOUT: %TakeIncomplete.ref.loc103: <function> = name_reference "TakeIncomplete", package.%TakeIncomplete
|
|
|
// CHECK:STDOUT: %p.ref: Class* = name_reference "p", %p
|
|
|
-// CHECK:STDOUT: %.loc82_18: ref Class = dereference %p.ref
|
|
|
-// CHECK:STDOUT: %.loc82_17: type = tuple_type ()
|
|
|
-// CHECK:STDOUT: %TakeIncomplete.ref.loc93: <function> = name_reference "TakeIncomplete", package.%TakeIncomplete
|
|
|
-// CHECK:STDOUT: %.loc93: {} = struct_literal ()
|
|
|
+// CHECK:STDOUT: %.loc103_18: ref Class = dereference %p.ref
|
|
|
+// CHECK:STDOUT: %.loc103_17: type = tuple_type ()
|
|
|
+// CHECK:STDOUT: %TakeIncomplete.ref.loc114: <function> = name_reference "TakeIncomplete", package.%TakeIncomplete
|
|
|
+// CHECK:STDOUT: %.loc114: {} = struct_literal ()
|
|
|
// CHECK:STDOUT: return
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: fn @CallReturnIncomplete() {
|
|
|
// CHECK:STDOUT: !entry:
|
|
|
// CHECK:STDOUT: %ReturnIncomplete.ref: <function> = name_reference "ReturnIncomplete", package.%ReturnIncomplete
|
|
|
-// CHECK:STDOUT: %.loc97: init <error> = call %ReturnIncomplete.ref()
|
|
|
+// CHECK:STDOUT: %.loc118: init <error> = call %ReturnIncomplete.ref()
|
|
|
// CHECK:STDOUT: return
|
|
|
// CHECK:STDOUT: }
|