From 6bb3d79cbd853601623095b497a1807489c3ef6e Mon Sep 17 00:00:00 2001 From: zinc Date: Wed, 14 Oct 2026 09:39:22 +0000 Subject: add c-style typedef and a built-in string alias typedef T name; binds name to the type record of T, at the top level or in a function (scoped to its block). string is a built-in alias for char*. A type name straight before , or ) in a parameter list is the parameter's name, so fn f(string) still works. The language server shows typedef T name; on hover and highlights typedef as a keyword. --- tests/langerrors/typedef_generic_bare.zc | 6 ++++++ tests/langerrors/typedef_local_redefine.zc | 8 ++++++++ tests/langerrors/typedef_redefine.zc | 6 ++++++ tests/langerrors/typedef_scope.zc | 8 ++++++++ tests/langerrors/typedef_string_redefine.zc | 5 +++++ tests/langerrors/typedef_tag.zc | 5 +++++ tests/langerrors/typedef_unknown.zc | 5 +++++ tests/langerrors/typedef_variable_clash.zc | 8 ++++++++ tests/langerrors/typedef_void_variable.zc | 5 +++++ 9 files changed, 56 insertions(+) create mode 100644 tests/langerrors/typedef_generic_bare.zc create mode 100644 tests/langerrors/typedef_local_redefine.zc create mode 100644 tests/langerrors/typedef_redefine.zc create mode 100644 tests/langerrors/typedef_scope.zc create mode 100644 tests/langerrors/typedef_string_redefine.zc create mode 100644 tests/langerrors/typedef_tag.zc create mode 100644 tests/langerrors/typedef_unknown.zc create mode 100644 tests/langerrors/typedef_variable_clash.zc create mode 100644 tests/langerrors/typedef_void_variable.zc (limited to 'tests/langerrors') diff --git a/tests/langerrors/typedef_generic_bare.zc b/tests/langerrors/typedef_generic_bare.zc new file mode 100644 index 0000000..5f3e906 --- /dev/null +++ b/tests/langerrors/typedef_generic_bare.zc @@ -0,0 +1,6 @@ +namespace; + +// expect: expected '<', found 'plain' +struct box { T item; }; +typedef box plain; +fn main() { return 0; } diff --git a/tests/langerrors/typedef_local_redefine.zc b/tests/langerrors/typedef_local_redefine.zc new file mode 100644 index 0000000..e51c32f --- /dev/null +++ b/tests/langerrors/typedef_local_redefine.zc @@ -0,0 +1,8 @@ +namespace; + +// expect: cell: already defined +fn main() { + typedef int cell; + typedef char* cell; + return 0; +} diff --git a/tests/langerrors/typedef_redefine.zc b/tests/langerrors/typedef_redefine.zc new file mode 100644 index 0000000..05085ec --- /dev/null +++ b/tests/langerrors/typedef_redefine.zc @@ -0,0 +1,6 @@ +namespace; + +// expect: num: already defined +typedef int num; +typedef char* num; +fn main() { return 0; } diff --git a/tests/langerrors/typedef_scope.zc b/tests/langerrors/typedef_scope.zc new file mode 100644 index 0000000..833e30e --- /dev/null +++ b/tests/langerrors/typedef_scope.zc @@ -0,0 +1,8 @@ +namespace; + +// expect: expected ';', found 'x' +fn main() { + { typedef int cell; cell a = 1; } + cell x = 2; + return 0; +} diff --git a/tests/langerrors/typedef_string_redefine.zc b/tests/langerrors/typedef_string_redefine.zc new file mode 100644 index 0000000..226a94e --- /dev/null +++ b/tests/langerrors/typedef_string_redefine.zc @@ -0,0 +1,5 @@ +namespace; + +// expect: string: already defined +typedef int string; +fn main() { return 0; } diff --git a/tests/langerrors/typedef_tag.zc b/tests/langerrors/typedef_tag.zc new file mode 100644 index 0000000..70ab491 --- /dev/null +++ b/tests/langerrors/typedef_tag.zc @@ -0,0 +1,5 @@ +namespace; + +// expect: a typedef names a type, which has no tag +typedef char*.u owned; +fn main() { return 0; } diff --git a/tests/langerrors/typedef_unknown.zc b/tests/langerrors/typedef_unknown.zc new file mode 100644 index 0000000..8076e86 --- /dev/null +++ b/tests/langerrors/typedef_unknown.zc @@ -0,0 +1,5 @@ +namespace; + +// expect: missing_t: isn't a type +typedef missing_t thing; +fn main() { return 0; } diff --git a/tests/langerrors/typedef_variable_clash.zc b/tests/langerrors/typedef_variable_clash.zc new file mode 100644 index 0000000..2c843f2 --- /dev/null +++ b/tests/langerrors/typedef_variable_clash.zc @@ -0,0 +1,8 @@ +namespace; + +// expect: count: already defined +fn main() { + int count = 1; + typedef int count; + return count; +} diff --git a/tests/langerrors/typedef_void_variable.zc b/tests/langerrors/typedef_void_variable.zc new file mode 100644 index 0000000..c5c7ced --- /dev/null +++ b/tests/langerrors/typedef_void_variable.zc @@ -0,0 +1,5 @@ +namespace; + +// expect: a variable can't be void +typedef void nothing; +fn main() { nothing x; return 0; } -- cgit v1.2.3