-
Notifications
You must be signed in to change notification settings - Fork 1
GLM round overload ambiguity with Intel LLVM SYCL #83
Description
Summary
Upgrading Intel LLVM SYCL beyond the nightly-2025-02-27 tag causes a build failure
in any FunGT translation unit that is compiled with -fsycl and transitively includes
GLM 1.0.1 headers. The failure is a hard compiler error, not a warning.
Error
error: address of overloaded function 'round' is ambiguous
return detail::functor1<vec, L, T, T, Q>::call(round, x);
Triggered in glm/detail/func_common.inl and glm/detail/func_packing.inl.
Root cause
The new SYCL cmath wrapper (__sycl_cmath_wrapper_impl.hpp) injects additional round
overloads into the global namespace earlier in the include chain than previous builds did.
GLM 1.0.1 passes round as a bare unqualified function pointer to functor1::call,
which is ambiguous when multiple overloads are visible.
The affected GLM call sites are:
glm/detail/func_common.inl:
return detail::functor1<vec, L, T, T, Q>::call(round, x);glm/detail/func_packing.inl (four locations, lines 17, 46, 75, 106):
vec<2, unsigned short, defaultp> result(round(clamp(v, 0.0f, 1.0f) * 65535.0f));Affected configuration
SYCL build: Intel LLVM sycl branch, any commit after nightly-2025-02-27
GLM version: 1.0.1 (confirmed unfixed in current HEAD as of March 2025)
Compiler: Intel LLVM clang++ with -fsycl
Platform: Linux x86_64
Workaround (current, post-IWOCL)
FunGT is pinned to SYCL nightly-2025-02-27 (commit cdcf1a6bd644) via branch
fungt-working-branch-feb-2025 until this is resolved.
Proper fix
Two independent fixes are needed, either one alone resolves the issue:
Option 1: Fix GLM (preferred, upstream PR)
In glm/detail/func_common.inl, qualify the function pointer:
return detail::functor1<vec, L, T, T, Q>::call(static_cast<T(*)(T)>(std::round), x);In glm/detail/func_packing.inl, same pattern at all four call sites:
vec<2, unsigned short, defaultp> result(
static_cast<float(*)(float)>(std::round)(clamp(v, 0.0f, 1.0f) * 65535.0f));This fix is confirmed not yet applied in GLM HEAD as of March 2025. A PR to the GLM
repository at https://github.com/g-truc/glm is planned.
Option 2: Compilation firewall (long term FunGT architecture)
Ensure GLM headers never appear in any translation unit compiled with -fsycl.
The SYCL-facing translation units (sycl_renderer.cpp, sycl_texture.cpp, particle
simulation, physics) use only fungt::Vec3 and primitive types. GLM is restricted to
host-only translation units compiled without -fsycl.
This is the correct long-term architecture regardless of the GLM fix.
Dependencies
Resolving this unblocks upgrading to newer SYCL nightlies, which may be required for
future IGC compatibility. IGC versions newer than 1.0.16510.2 may require a SYCL
build newer than nightly-2025-02-27.
Priority
Post-IWOCL 2026.