Repository: bulletphysics/bullet3

Issue:
Build errors in the python module
Build of the py27-bullet3-2.87 FreeBSD port fails with clang:
```
cc -DNDEBUG -O2 -pipe -fstack-protector -isystem /usr/local/include -fno-strict-aliasing -isystem /usr/local/include -fPIC -Isrc -Iexamples/ThirdPartyLibs -Iexamples/ThirdPartyLibs/Glew -Iexamples/ThirdPartyLibs/enet/include -Iexamples/ThirdPartyLibs/clsocket/src -I/usr/local/include/python2.7 -c examples/SharedMemory/PhysicsServerExample.cpp -o build/temp.freebsd-12.0-CURRENT-amd64-2.7/examples/SharedMemory/PhysicsServerExample.o -DGWEN_COMPILE_STATIC -DBT_USE_DOUBLE_PRECISION -DBT_ENABLE_ENET -DBT_ENABLE_CLSOCKET -DB3_DUMP_PYTHON_VERSION -D_BSD -I/usr/X11R6/include -DHAS_SOCKLEN_T
examples/SharedMemory/PhysicsServerExample.cpp:2419:5: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list [-Wc++11-narrowing]
                                m_multiThreadedHelper->m_userDebugText[i].m_textColorRGB[0],
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
examples/SharedMemory/PhysicsServerExample.cpp:2419:5: note: insert an explicit cast to silence this issue
                                m_multiThreadedHelper->m_userDebugText[i].m_textColorRGB[0],
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                static_cast<float>(                                        )
examples/SharedMemory/PhysicsServerExample.cpp:2420:5: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list [-Wc++11-narrowing]
                                m_multiThreadedHelper->m_userDebugText[i].m_textColorRGB[1],
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
examples/SharedMemory/PhysicsServerExample.cpp:2420:5: note: insert an explicit cast to silence this issue
                                m_multiThreadedHelper->m_userDebugText[i].m_textColorRGB[1],
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                static_cast<float>(                                        )
examples/SharedMemory/PhysicsServerExample.cpp:2421:5: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list [-Wc++11-narrowing]
                                m_multiThreadedHelper->m_userDebugText[i].m_textColorRGB[2],
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
examples/SharedMemory/PhysicsServerExample.cpp:2421:5: note: insert an explicit cast to silence this issue
                                m_multiThreadedHelper->m_userDebugText[i].m_textColorRGB[2],
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                static_cast<float>(                                        )
examples/SharedMemory/PhysicsServerExample.cpp:2424:20: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list [-Wc++11-narrowing]
                        float pos[3] = {m_multiThreadedHelper->m_userDebugText[i].m_textPositionXYZ1[0],
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
examples/SharedMemory/PhysicsServerExample.cpp:2424:20: note: insert an explicit cast to silence this issue
                        float pos[3] = {m_multiThreadedHelper->m_userDebugText[i].m_textPositionXYZ1[0],
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                        static_cast<float>(                                            )
examples/SharedMemory/PhysicsServerExample.cpp:2425:4: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list [-Wc++11-narrowing]
                        m_multiThreadedHelper->m_userDebugText[i].m_textPositionXYZ1[1],
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
examples/SharedMemory/PhysicsServerExample.cpp:2425:4: note: insert an explicit cast to silence this issue
                        m_multiThreadedHelper->m_userDebugText[i].m_textPositionXYZ1[1],
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        static_cast<float>(                                            )
examples/SharedMemory/PhysicsServerExample.cpp:2426:4: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list [-Wc++11-narrowing]
                        m_multiThreadedHelper->m_userDebugText[i].m_textPositionXYZ1[2]};
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
examples/SharedMemory/PhysicsServerExample.cpp:2426:4: note: insert an explicit cast to silence this issue
                        m_multiThreadedHelper->m_userDebugText[i].m_textPositionXYZ1[2]};
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        static_cast<float>(                                            )
6 errors generated.
```

The clang version is likely 5.0.

Also, please remove all ```register``` keywords. They do nothing with modern compiler, only produce warnings:
```
examples/ThirdPartyLibs/BussIK/LinearR3.h:1539:32: warning: 'register' storage class specifier is deprecated and incompatible with C++17 [-Wdeprecated-register]
inline LinearMapR3 operator* ( register double b, const LinearMapR3& A)
                               ^~~~~~~~~
examples/ThirdPartyLibs/BussIK/LinearR3.h:1548:2: warning: 'register' storage class specifier is deprecated and incompatible with C++17 [-Wdeprecated-register]
        register double bInv = 1.0/b;
        ^~~~~~~~~
examples/ThirdPartyLibs/BussIK/LinearR3.h:1554:46: warning: 'register' storage class specifier is deprecated and incompatible with C++17 [-Wdeprecated-register]
inline LinearMapR3& LinearMapR3::operator/= (register double b)
                                             ^~~~~~~~~
```


Discussion:
@erwincoumans Any chance to fix this? The build fails with clang-6.

If you care, fork the repo, fix the error, create a pull request. Only deal with the error, no other changes in the pull request makes it more like to be accepted.
> If you care, fork the repo, fix the error, create a pull request. Only deal with the error, no other changes in the pull request makes it more like to be accepted.

I am a maintainer of the FreeBSD port. I don't really use it, and can't spend a significant time debugging the third party packages. You as a project owner should be more interested in your project being buildable on various systems with different compilers.

Currently it fails with C++ errors with clang-6.


Patch:
diff --git a/.ci/docker/env.list b/.ci/docker/env.list
new file mode 100644
index 0000000000..77dcd5baa1
--- /dev/null
+++ b/.ci/docker/env.list
@@ -0,0 +1,7 @@
+TRAVIS_OS_NAME
+TRAVIS_PULL_REQUEST
+
+BUILD_NAME
+CC
+CXX
+SUDO
diff --git a/.ci/docker/ubuntu-bionic b/.ci/docker/ubuntu-bionic
new file mode 100644
index 0000000000..b7643438ea
--- /dev/null
+++ b/.ci/docker/ubuntu-bionic
@@ -0,0 +1,18 @@
+FROM ubuntu:bionic
+
+RUN apt-get update -qq
+RUN apt-get install -y \
+    build-essential  \
+    clang \
+    cmake \
+    curl \
+    git \
+    libgl-dev \
+    libglu-dev \
+    libpython3-dev \
+    lsb-release \
+    pkg-config \
+    python3 \
+    python3-distutils \
+    software-properties-common \
+    sudo
diff --git a/.ci/docker/ubuntu-xenial b/.ci/docker/ubuntu-xenial
new file mode 100644
index 0000000000..693e8a1fdd
--- /dev/null
+++ b/.ci/docker/ubuntu-xenial
@@ -0,0 +1,17 @@
+FROM ubuntu:xenial
+
+RUN apt-get update -qq
+RUN apt-get install -y \
+    build-essential  \
+    clang \
+    cmake \
+    curl \
+    git \
+    libgl-dev \
+    libglu-dev \
+    libpython3-dev \
+    lsb-release \
+    pkg-config \
+    python3 \
+    software-properties-common \
+    sudo
diff --git a/.ci/script.sh b/.ci/script.sh
new file mode 100755
index 0000000000..7fff323bf2
--- /dev/null
+++ b/.ci/script.sh
@@ -0,0 +1,30 @@
+#!/usr/bin/env bash
+set -ex
+
+echo "CXX="$CXX
+echo "CC="$CC
+if [[ "$TRAVIS_OS_NAME" == "linux" && "$CXX" = "g++" ]]; then
+  $SUDO apt-get update
+  $SUDO apt-get install -y python3
+  $SUDO apt-get install -y python3-pip
+  $SUDO pip3 install -U wheel
+  $SUDO pip3 install -U setuptools
+  $SUDO python3 setup.py install
+  python3 examples/pybullet/unittests/unittests.py --verbose
+  python3 examples/pybullet/unittests/userDataTest.py --verbose
+  python3 examples/pybullet/unittests/saveRestoreStateTest.py --verbose
+fi
+cmake . -DBUILD_PYBULLET=ON -G"Unix Makefiles" #-DCMAKE_CXX_FLAGS=-Werror
+make -j8
+ctest -j8 --output-on-failure
+
+# Build again with double precision
+cmake . -G "Unix Makefiles" -DUSE_DOUBLE_PRECISION=ON #-DCMAKE_CXX_FLAGS=-Werror
+make -j8
+ctest -j8 --output-on-failure
+
+# Build again with shared libraries
+cmake . -G "Unix Makefiles" -DBUILD_SHARED_LIBS=ON
+make -j8
+ctest -j8 --output-on-failure
+$SUDO make install
diff --git a/.travis.yml b/.travis.yml
index c93c1d2ce3..fbaf6d90f3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,35 +1,56 @@
 language: cpp
-os:
-  - linux
-  - osx
-compiler:
-  - gcc
-  - clang
-addons:
-  apt:
-    packages:
-      - python3
-
-
+matrix:
+  include:
+    - os: linux
+      compiler: gcc
+      env:
+        - BUILD_NAME=TRUSTY_GCC
+        - SUDO=sudo
+    - os: linux
+      compiler: clang
+      env:
+        - BUILD_NAME=TRUSTY_CLANG
+        - SUDO=sudo
+    - os: linux
+      compiler: gcc
+      env:
+        - BUILD_NAME=XENIAL_GCC
+        - DOCKER_FILE="ubuntu-xenial"
+      services: docker
+    - os: linux
+      compiler: clang
+      env:
+        - BUILD_NAME=XENIAL_CLANG
+        - DOCKER_FILE="ubuntu-xenial"
+      services: docker
+    - os: linux
+      compiler: gcc
+      env:
+        - BUILD_NAME=BIONIC_GCC
+        - DOCKER_FILE="ubuntu-bionic"
+      services: docker
+    - os: linux
+      compiler: clang
+      env:
+        - BUILD_NAME=BIONIC_CLANG
+        - DOCKER_FILE="ubuntu-bionic"
+      services: docker
+    - os: osx
+      compiler: gcc
+      env:
+        - BUILD_NAME=OSX_GCC
+    - os: osx
+      compiler: clang
+      env:
+        - BUILD_NAME=OSX_CLANG
+before_install:
+  - if [ -n "$DOCKER_FILE" ]; then
+      docker build -t "$DOCKER_FILE" -f ".ci/docker/$DOCKER_FILE" .;
+      docker run -itd -v $TRAVIS_BUILD_DIR:$TRAVIS_BUILD_DIR --env-file .ci/docker/env.list --name bullet-docker "$DOCKER_FILE";
+    fi
 script:
-  - echo "CXX="$CXX
-  - echo "CC="$CC
-  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CXX" = "g++" ]]; then sudo apt-get install python3-pip; fi
-  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CXX" = "g++" ]]; then sudo pip3 install -U pip wheel; fi
-  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CXX" = "g++" ]]; then sudo pip3 install setuptools; fi
-  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CXX" = "g++" ]]; then sudo python3 setup.py install; fi
-  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CXX" = "g++" ]]; then python3 examples/pybullet/unittests/unittests.py --verbose; fi
-  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CXX" = "g++" ]]; then python3 examples/pybullet/unittests/userDataTest.py --verbose; fi
-  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$CXX" = "g++" ]]; then python3 examples/pybullet/unittests/saveRestoreStateTest.py --verbose; fi
-  - cmake . -DBUILD_PYBULLET=ON -G"Unix Makefiles" #-DCMAKE_CXX_FLAGS=-Werror
-  - make -j8
-  - ctest -j8 --output-on-failure
-  # Build again with double precision
-  - cmake . -G "Unix Makefiles" -DUSE_DOUBLE_PRECISION=ON #-DCMAKE_CXX_FLAGS=-Werror
-  - make -j8
-  - ctest -j8 --output-on-failure
-  # Build again with shared libraries
-  - cmake . -G "Unix Makefiles" -DBUILD_SHARED_LIBS=ON
-  - make -j8
-  - ctest -j8 --output-on-failure
-  - sudo make install
+  - if [ -n "$DOCKER_FILE" ]; then
+      docker exec bullet-docker /bin/sh -c "cd $TRAVIS_BUILD_DIR && ./.ci/script.sh";
+    else
+      '.ci/script.sh';
+    fi
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2a951d25a7..728ac76080 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -316,7 +316,7 @@ IF(BUILD_PYBULLET)
 	SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build3/cmake ${CMAKE_MODULE_PATH})
 	OPTION(EXACT_PYTHON_VERSION "Require Python and match PYTHON_VERSION_PYBULLET exactly, e.g. 2.7.12" OFF)
 	IF(EXACT_PYTHON_VERSION)
-	set(EXACT_PYTHON_VERSION_FLAG EXACT REQUIRED)
+	    set(EXACT_PYTHON_VERSION_FLAG EXACT REQUIRED)
 	ENDIF(EXACT_PYTHON_VERSION)
 	# first find the python interpreter
 	FIND_PACKAGE(PythonInterp ${PYTHON_VERSION_PYBULLET} ${EXACT_PYTHON_VERSION_FLAG})
diff --git a/examples/MultiBody/InvertedPendulumPDControl.cpp b/examples/MultiBody/InvertedPendulumPDControl.cpp
index d380929c48..f6277739b4 100644
--- a/examples/MultiBody/InvertedPendulumPDControl.cpp
+++ b/examples/MultiBody/InvertedPendulumPDControl.cpp
@@ -268,7 +268,7 @@ btMultiBody* createInvertedPendulumMultiBody(btMultiBodyDynamicsWorld* world, GU
         btVector3 posr = local_origin[i+1];
     //	float pos[4]={posr.x(),posr.y(),posr.z(),1};
 
-        float quat[4]={-world_to_local[i+1].x(),-world_to_local[i+1].y(),-world_to_local[i+1].z(),world_to_local[i+1].w()};
+		const btScalar quat[4]={-world_to_local[i+1].x(),-world_to_local[i+1].y(),-world_to_local[i+1].z(),world_to_local[i+1].w()};
 		btCollisionShape* shape =0;
 
 		if (i==0)
diff --git a/examples/MultiBody/MultiBodyConstraintFeedback.cpp b/examples/MultiBody/MultiBodyConstraintFeedback.cpp
index c08d98f720..f4d9593584 100644
--- a/examples/MultiBody/MultiBodyConstraintFeedback.cpp
+++ b/examples/MultiBody/MultiBodyConstraintFeedback.cpp
@@ -320,7 +320,7 @@ void MultiBodyConstraintFeedbackSetup::initPhysics()
             btVector3 posr = local_origin[i+1];
         //	float pos[4]={posr.x(),posr.y(),posr.z(),1};
 
-            float quat[4]={-world_to_local[i+1].x(),-world_to_local[i+1].y(),-world_to_local[i+1].z(),world_to_local[i+1].w()};
+			const btScalar quat[4]={-world_to_local[i+1].x(),-world_to_local[i+1].y(),-world_to_local[i+1].z(),world_to_local[i+1].w()};
 			btCollisionShape* shape =0;
 
 			if (i==0)