Infered Function Attributes

Jin nin-jin at ya.ru
Mon Jan 6 22:59:46 UTC 2025


Currenly we have:
- Flags with different rules what can be called by what: pure, 
nothrow, static...
- Different syntax: pure, @nogc.

Idea - generalize attributes:
- Prefer only one syntax.
- Add syntax to define rules of attributes infering.
- Define this rules for current attributes in std library.
- Support any infered type, not only flags.
- Support by language server for showing inferred attributes.

Some use cases beyond the existing:

1. **@max_stack** - required stack size for calling function.

```d
void xxx(); // defined @max_stack( X ) by compiler
void yyy() @max_stack( 128 ); // manually defined

bar() { // inferred @max_stack( B + max( X, 128 ) )
     xxx();
     yyy();
}

void foo() { // inferred @max_stack( F + B + max( X, 128 ) )
     bar();
}
```

2. **@iterations, @allocations** - asymptotics of function.

```d
@iterations( arr.length * log( arr.length ) ) // manual defined
@allocations( 1 ) // manual defined
void sort( Item )( Item[] arr );

// inferred @iterations( arr.length * ( arr[0].length * log( 
arr[0].length ) ) )
// inferred @allocations( 1 )
void sort( Item )( Item[][] arr ) {
     foreach( row; arr ) row.sort;
}
```

3. **@throws** - Exceptions that can be thrown by function.

```d
@throws( NotFound )// manually defined
string read();

@throws( NoSpace ) // manually defined
string write( string data );

// inferred @throws( NotFound, NoSpace )
string update( path ) {
     write( read() );
}

// inferred @throws() aka nothrow
string tryUpdate( path ) {
     try {
         write( read() );
     } finally {}
}

```

I suggest we fantasize about this topic and come up with other 
useful applications for inferring function attributes.


More information about the dip.ideas mailing list