diff --git a/loopy/expression.py b/loopy/expression.py index 42c54af7114685af351acdae048efbad3ebd5b2d..6fd49661d617f65d2cdbc5773c3a59955da8c19c 100644 --- a/loopy/expression.py +++ b/loopy/expression.py @@ -213,17 +213,19 @@ class TypeInferenceMapper(CombineMapper): mangle_result = self.kernel.mangle_function(identifier, arg_dtypes) if multiple_types_ok: - return mangle_result.result_dtypes + if mangle_result is not None: + return mangle_result.result_dtypes else: - if len(mangle_result.result_dtypes) != 1 and not multiple_types_ok: - raise LoopyError("functions with more or fewer than one " - "return value may only be used in direct assignments") - if mangle_result is not None: + if len(mangle_result.result_dtypes) != 1 and not multiple_types_ok: + raise LoopyError("functions with more or fewer than one " + "return value may only be used in direct assignments") + return mangle_result.result_dtypes[0] - raise RuntimeError("no type inference information on " - "function '%s'" % identifier) + raise RuntimeError("unable to resolve " + "function '%s' with %d given arguments" + % (identifier, len(arg_dtypes))) def map_variable(self, expr): if expr.name in self.kernel.all_inames(): @@ -274,7 +276,8 @@ class TypeInferenceMapper(CombineMapper): def map_lookup(self, expr): agg_result = self.rec(expr.aggregate) - dtype, offset = agg_result.numpy_dtype.fields[expr.name] + field = agg_result.numpy_dtype.fields[expr.name] + dtype = field[0] return NumpyType(dtype) def map_comparison(self, expr):