Mostly AI generated bug report, but it's better than what I would write :)
I ran into issue when using SasView sample component together with Union_master, but the provided simple example reproduces the same error.
Describe the bug
On macOS, compiling instruments that include <tgmath.h> (e.g. when using SasView models or GPU-accelerated configurations) fails with compiler syntax errors when components like Union_master or Refractor are included in the same translation unit.
This occurs because <tgmath.h> automatically includes the C99 <complex.h> header, which defines the imaginary unit macro #define I _Complex_I. This macro collides with the local Coords I variable declarations used in the math sections of Union_master.comp and Refractor.comp.
Document steps to reproduce the bug
Steps to reproduce the behavior:
1. Save the following minimal instrument as test_collision.instr:
DEFINE INSTRUMENT test_collision()
DECLARE
%{
/*
* Simulates includes that pull in <complex.h> (like <tgmath.h> for type-generic math).
*/
#include <tgmath.h>
%}
TRACE
COMPONENT origin = Arm() AT (0,0,0) ABSOLUTE
COMPONENT ref = Refractor(
xwidth=0.1, yheight=0.1, zdepth=0.1
) AT (0,0,1) RELATIVE origin
END
- Compile the instrument using the terminal command:
mcrun -c test_collision.instr
- See compiler syntax errors pointing to the variable
I (which has been macro-expanded to _Complex_I):
test_collision.c:11257:16: error: expected identifier or '('
11257 | Coords I = coords_scale (V, 1 / v); // normalised ray = v/|v|
| ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/complex.h:42:11: note: expanded from macro 'I'
42 | #define I _Complex_I
| ^
test_collision.c:11260:44: error: passing '_Complex float' to parameter of incompatible type 'Coords'
11260 | double cos_theta1 = -coords_sp (N, I); // cos(theta1) = -N.I
| ^
Expected behavior
The generated C code should compile successfully without syntax errors.
Screenshots
N/A
OS and McStas/McXtrace version (please complete the following information):
- OS: macOS 15.7.7 (Build 24G720),
x86_64
- McCode variant: McStas
- Version: 3.7.9
Add your code / dataset
See above.
Command used:
mcrun -c test_collision.instr
(using Xcode SDK clang as the C compiler).
Additional context
The variable I is declared and used in at least the following places:
1. union/Union_master.comp (around line 2746):
c Coords I = coords_scale (V, 1 / v_length);
2. optics/Refractor.comp (around line 596):
c Coords I = coords_scale (V, 1 / v);
Suggested Fix:
Rename the I variable in the affected components to a less generic name (e.g. I_dir or I_vec representing the normalized ray direction). Using single-letter variables like I is highly prone to collisions with C99 headers.
Mostly AI generated bug report, but it's better than what I would write :)
I ran into issue when using SasView sample component together with Union_master, but the provided simple example reproduces the same error.
Describe the bug
On macOS, compiling instruments that include
<tgmath.h>(e.g. when using SasView models or GPU-accelerated configurations) fails with compiler syntax errors when components likeUnion_masterorRefractorare included in the same translation unit.This occurs because
<tgmath.h>automatically includes the C99<complex.h>header, which defines the imaginary unit macro#define I _Complex_I. This macro collides with the localCoords Ivariable declarations used in the math sections ofUnion_master.compandRefractor.comp.Document steps to reproduce the bug
Steps to reproduce the behavior:
1. Save the following minimal instrument as
test_collision.instr:I(which has been macro-expanded to_Complex_I):Expected behavior
The generated C code should compile successfully without syntax errors.
Screenshots
N/A
OS and McStas/McXtrace version (please complete the following information):
x86_64Add your code / dataset
See above.
Command used:
(using Xcode SDK clang as the C compiler).
Additional context
The variable
Iis declared and used in at least the following places:1.
union/Union_master.comp(around line 2746):c Coords I = coords_scale (V, 1 / v_length);2.
optics/Refractor.comp(around line 596):c Coords I = coords_scale (V, 1 / v);Suggested Fix:
Rename the
Ivariable in the affected components to a less generic name (e.g.I_dirorI_vecrepresenting the normalized ray direction). Using single-letter variables likeIis highly prone to collisions with C99 headers.