Skip to content

Commit

Permalink
Show error when declarations do not start with fn in interfaces. #1565
Browse files Browse the repository at this point in the history
. Some added functionality to lists and time.
  • Loading branch information
lerno committed Oct 18, 2024
1 parent c013006 commit 78d5939
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/std/collections/linkedlist.c3
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,11 @@ fn Type! LinkedList.pop(&self)
return self._last.value;
}

fn bool LinkedList.is_empty(&self)
{
return !self._first;
}

fn Type! LinkedList.pop_front(&self)
{
if (!self._first) return IteratorResult.NO_MORE_ELEMENT?;
Expand Down
10 changes: 10 additions & 0 deletions lib/std/collections/priorityqueue.c3
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ fn void PrivatePriorityQueue.temp_init(&self, usz initial_capacity = 16) @inline
self.heap.new_init(initial_capacity, allocator::temp()) @inline;
}


fn void PrivatePriorityQueue.push(&self, Type element)
{
self.heap.push(element);
Expand All @@ -66,6 +67,15 @@ fn void PrivatePriorityQueue.push(&self, Type element)
}
}

fn void PrivatePriorityQueue.remove_at(&self, usz index)
{
if (index == 0)
{
self.pop()!!;
return;
}
self.heap.remove_at(index);
}
<*
@require self != null
*>
Expand Down
10 changes: 10 additions & 0 deletions lib/std/time/time.c3
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ distinct Duration = long;
distinct Clock = ulong;
distinct NanoDuration (Printable) = long;

const Time FAR_FUTURE = long.max;
const Time FAR_PAST = long.min;
const Duration US = 1;
const Duration MS = 1_000;
const Duration SEC = 1_000_000;
Expand All @@ -15,6 +17,7 @@ const Duration DAY = 24 * HOUR;
const Duration WEEK = 7 * DAY;
const Duration MONTH = 30 * DAY;
const Duration YEAR = 36525 * DAY / 100;
const Duration FOREVER = long.max;

fn Duration us(long l) @inline => (Duration)l * US;
fn Duration ms(long l) @inline => (Duration)l * MS;
Expand Down Expand Up @@ -86,6 +89,13 @@ fn Time Time.add_hours(time, long hours) => time + (Time)(hours * (long)HOUR);
fn Time Time.add_days(time, long days) => time + (Time)(days * (long)DAY);
fn Time Time.add_weeks(time, long weeks) => time + (Time)(weeks * (long)WEEK);
fn Time Time.add_duration(time, Duration duration) => time + (Time)duration;

fn int Time.compare_to(time, Time other)
{
if (time == other) return 0;
return time > other ? 1 : -1;
}

fn double Time.to_seconds(time) => (long)time / (double)SEC;
fn Duration Time.diff_us(time, Time other) => (Duration)(time - other);
fn double Time.diff_sec(time, Time other) => (long)time.diff_us(other) / (double)SEC;
Expand Down
1 change: 1 addition & 0 deletions releasenotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
- Wrong error message for interface methods with body #1536.
- Empty expression block would crash compiler with debug on #1554.
- Improve infer conversions on constants, e.g. `ZString a = foo ? "a" : "b";` #1561
- Show error when declarations do not start with `fn` in interfaces. #1565

### Stdlib changes
- Remove unintended print of `char[]` as String
Expand Down
4 changes: 4 additions & 0 deletions src/compiler/parse_global.c
Original file line number Diff line number Diff line change
Expand Up @@ -1770,6 +1770,10 @@ INLINE bool parse_interface_body(ParseContext *c, Decl *interface)
{
AstId contracts = 0;
if (!parse_contracts(c, &contracts)) return poisoned_decl;
if (!tok_is(c, TOKEN_FN))
{
RETURN_PRINT_ERROR_HERE("Interfaces can only have function declarations, and they must start with 'fn' as usual.");
}
ASSIGN_DECL_OR_RET(Decl *interface_fn, parse_func_definition(c, contracts, FUNC_PARSE_INTERFACE), false);
vec_add(fns, interface_fn);
}
Expand Down
4 changes: 4 additions & 0 deletions test/test_suite/any/interface_no_fn.c3
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface IOp {
int val; // #error: Interfaces can only have function
int my_fn(); // missing fn
}

0 comments on commit 78d5939

Please sign in to comment.