Skip to content

Commit

Permalink
bug[next]: Improve error message on invalid call to field operator an…
Browse files Browse the repository at this point in the history
…d program (#1323)

After #1275 most of the error message given to the user when calling a field operator or program with invalid arguments was only available in verbose mode. This PR shows this information again.

```python
@field_operator
def foo(x: IField):
    return x

@field_operator
def testee(a: IField, b: IField, c: IField) -> IField:
    return foo(1)
```

```
gt4py.next.errors.exceptions.DSLError: Invalid argument types in call to `foo`.
E           Invalid call to function of type `FieldOperatorType(definition=FunctionType(pos_only_args=[], pos_or_kw_args={'x': FieldType(dims=[Dimension(value='IDim', kind=<DimensionKind.HORIZONTAL: 'horizontal'>)], dtype=ScalarType(kind=<ScalarKind.INT32: 32>, shape=None))}, kw_only_args={}, returns=FieldType(dims=[Dimension(value='IDim', kind=<DimensionKind.HORIZONTAL: 'horizontal'>)], dtype=ScalarType(kind=<ScalarKind.INT32: 32>, shape=None))))`:
E             - Expected argument `x` to be of type `Field[[IDim], int32]`, but got `int32`.
E             File ".../gt4py_functional/tests/next_tests/integration_tests/feature_tests/ffront_tests/test_arg_call_interface.py", line 113
E                       return foo(1)
```
  • Loading branch information
tehrengruber authored Jan 22, 2024
1 parent 90e5d5a commit e20294e
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 4 deletions.
4 changes: 3 additions & 1 deletion src/gt4py/next/ffront/decorator.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,9 @@ def _validate_args(self, *args, **kwargs) -> None:
raise_exception=True,
)
except ValueError as err:
raise TypeError(f"Invalid argument types in call to '{self.past_node.id}'.") from err
raise errors.DSLError(
None, f"Invalid argument types in call to '{self.past_node.id}'.\n{err}"
) from err

def _process_args(self, args: tuple, kwargs: dict) -> tuple[tuple, tuple, dict[str, Any]]:
self._validate_args(*args, **kwargs)
Expand Down
2 changes: 1 addition & 1 deletion src/gt4py/next/ffront/foast_passes/type_deduction.py
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,7 @@ def visit_Call(self, node: foast.Call, **kwargs) -> foast.Call:
)
except ValueError as err:
raise errors.DSLError(
node.location, f"Invalid argument types in call to '{new_func}'."
node.location, f"Invalid argument types in call to '{new_func}'.\n{err}"
) from err

return_type = type_info.return_type(func_type, with_args=arg_types, with_kwargs=kwarg_types)
Expand Down
2 changes: 1 addition & 1 deletion src/gt4py/next/ffront/past_passes/type_deduction.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ def visit_Call(self, node: past.Call, **kwargs):
)

except ValueError as ex:
raise errors.DSLError(node.location, f"Invalid call to '{node.func.id}'.") from ex
raise errors.DSLError(node.location, f"Invalid call to '{node.func.id}'.\n{ex}") from ex

return past.Call(
func=new_func,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import pytest

import gt4py.next as gtx
from gt4py.next import errors

from next_tests.integration_tests import cases
from next_tests.integration_tests.cases import IDim, Ioff, JDim, cartesian_case, fieldview_backend
Expand Down Expand Up @@ -222,7 +223,7 @@ def test_wrong_argument_type(cartesian_case, copy_program_def):
inp = cartesian_case.as_field([JDim], np.ones((cartesian_case.default_sizes[JDim],)))
out = cases.allocate(cartesian_case, copy_program, "out").strategy(cases.ConstInitializer(1))()

with pytest.raises(TypeError) as exc_info:
with pytest.raises(errors.DSLError) as exc_info:
# program is defined on Field[[IDim], ...], but we call with
# Field[[JDim], ...]
copy_program(inp, out, offset_provider={})
Expand Down

0 comments on commit e20294e

Please sign in to comment.