Description | Use of abs() on a short type gives a build error when using it as an array index on gcc 6.3. Apparently the result of abs() is being treated as a double even though the input variables are of type short.
A fix is to cast the result of abs() resolves the issue:
<pre>
$ (cd EMSegment; svn diff)
Index: AMF/vtkImagePropagateDist.cxx
--- AMF/vtkImagePropagateDist.cxx (revision 17135)
+++ AMF/vtkImagePropagateDist.cxx (working copy)
@@ -61,7 +61,7 @@
#define dist2(a,b,c) (sq[abs(a)]+sq[abs(b)]+sq[abs(c)])
-#define dist(a,b,c) (distance[abs(a)][abs(b)][abs(c)])
+#define dist(a,b,c) (distance[(int)abs(a)][(int)abs(b)][(int)abs(c)])
</pre> |
---|
Additional Information | Here is the build error:
<pre>
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx: In member function \u2018void vtkImagePropagateDist::PropagateDanielsson2D()\u2019:
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:64:38: error: invalid types \u2018double[gnu_cxx::__enable_if<true, double>::type {aka double}]\u2019 for array subscript
#define dist(a,b,c) (distance[abs(a)][abs(b)][abs(c)])
^
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:408:24: note: in expansion of macro \u2018dist\u2019
val = val0 + dist(dx,dy,0);
^~~~
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:64:38: error: invalid types \u2018double[gnu_cxx::__enable_if<true, double>::type {aka double}]\u2019 for array subscript
#define dist(a,b,c) (distance[abs(a)][abs(b)][abs(c)])
^
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:421:24: note: in expansion of macro \u2018dist\u2019
val = val0 - dist(dx,dy,0);
^~~~
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:64:38: error: invalid types \u2018double[gnu_cxx::__enable_if<true, double>::type {aka double}]\u2019 for array subscript
#define dist(a,b,c) (distance[abs(a)][abs(b)][abs(c)])
^
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:515:24: note: in expansion of macro \u2018dist\u2019
val = val0 + dist(dx,dy,0);
^~~~
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:64:38: error: invalid types \u2018double[gnu_cxx::__enable_if<true, double>::type {aka double}]\u2019 for array subscript
#define dist(a,b,c) (distance[abs(a)][abs(b)][abs(c)])
^
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:530:24: note: in expansion of macro \u2018dist\u2019
val = val0 - dist(dx,dy,0);
^~~~
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx: In member function \u2018void vtkImagePropagateDist::PropagateDanielsson3D()\u2019:
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:64:38: error: invalid types \u2018double[gnu_cxx::__enable_if<true, double>::type {aka double}]\u2019 for array subscript
#define dist(a,b,c) (distance[abs(a)][abs(b)][abs(c)])
^
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:858:24: note: in expansion of macro \u2018dist\u2019
val = val0 + dist(dx,dy,dz);
^~~~
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:64:38: error: invalid types \u2018double[gnu_cxx::__enable_if<true, double>::type {aka double}]\u2019 for array subscript
#define dist(a,b,c) (distance[abs(a)][abs(b)][abs(c)])
^
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:871:24: note: in expansion of macro \u2018dist\u2019
val = val0 - dist(dx,dy,dz);
^~~~
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:64:38: error: invalid types \u2018double[gnu_cxx::__enable_if<true, double>::type {aka double}]\u2019 for array subscript
#define dist(a,b,c) (distance[abs(a)][abs(b)][abs(c)])
^
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:971:22: note: in expansion of macro \u2018dist\u2019
val = val0 + dist(dx,dy,dz);
^~~~
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:64:38: error: invalid types \u2018double[gnu_cxx::__enable_if<true, double>::type {aka double}]\u2019 for array subscript
#define dist(a,b,c) (distance[abs(a)][abs(b)][abs(c)])
^
/home/researcher/Slicer-superbuild/EMSegment/AMF/vtkImagePropagateDist.cxx:987:22: note: in expansion of macro \u2018dist\u2019
val = val0 - dist(dx,dy,dz);
^~~~
Modules/Remote/EMSegment/Qt/Logic/CMakeFiles/vtkSlicerEMSegmentModuleLogic.dir/build.make:1082: recipe for target 'Modules/Remote/EMSegment/Qt/Logic/CMakeFiles/vtkSlicerEMSegmentModuleLogic.dir///AMF/vtkImagePropagateDist.cxx.o' failed
make[2]: [Modules/Remote/EMSegment/Qt/Logic/CMakeFiles/vtkSlicerEMSegmentModuleLogic.dir///AMF/vtkImagePropagateDist.cxx.o] Error 1
CMakeFiles/Makefile2:31535: recipe for target 'Modules/Remote/EMSegment/Qt/Logic/CMakeFiles/vtkSlicerEMSegmentModuleLogic.dir/all' failed
make[1]: [Modules/Remote/EMSegment/Qt/Logic/CMakeFiles/vtkSlicerEMSegmentModuleLogic.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2
</pre> |
---|