This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GiNaC -- a C++ library for symbolic computations". The branch, master has been updated via a569b4748e266ce318602e7b6a9c1f19a8c75bdf (commit) via c3195f0b5a7ac9fdbfdd04e5f4acf6a836063de0 (commit) from 79f30c335f1ddbd3c76dfee5d76128b992b6b19c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a569b4748e266ce318602e7b6a9c1f19a8c75bdf Author: Alexey Sheplyakov <asheplyakov@altlinux.org> Date: Fri Jan 1 20:09:47 2021 +0400 bugfix: function: always pass evalf'ed arguments to evalf_funcp GiNaC passes unevaluted arguments to a function with evalf_funcp taking an exvector. Fixed that, and added a test case commit c3195f0b5a7ac9fdbfdd04e5f4acf6a836063de0 Author: Alexey Sheplyakov <asheplyakov@altlinux.org> Date: Wed Jan 6 11:20:46 2021 +0400 Avoid multiple definitions of `lst::info` (MinGW compile fix) [55/59] Linking CXX shared library bin/libginac.dll FAILED: bin/libginac.dll ginac/libginac.dll.a [skipped long list of object files] /usr/bin/x86_64-w64-mingw32-ld: ginac/CMakeFiles/ginac.dir/lst.cpp.obj: in function `GiNaC::ptr<GiNaC::basic>::~ptr()': /home/asheplyakov/work/sw/ginac/_build_w64/../ginac/container.h:150: multiple definition of `GiNaC::container<std::__cxx11::list>::info(unsigned int) const'; ginac/CMakeFiles/ginac.dir/integration_kernel.cpp.obj:/home/asheplyakov/work/sw/ginac/_build_w64/../ginac/container.h:116: first defined here integration_kernel.cpp makes use of GiNaC::lst without including the `lst.h` header. That's possible since there's a typedef in `registrar.h` (included by virtually all GiNaC sources) and a defintion in `container.h` (included via `add.h` -> `expairseq.h` -> `indexed.h` -> `exprseq.h`), so the compiler can instantiate container<std::list>. However the explicit specialization of `lst::info` is not available (in integration_kernel.cpp). This violates 17.8.3.6 [templ.expl.spec] which demands If a template, a member template or a member of a class template is explicitly specialized then that specialization shall be declared before the first use of that specialization that would cause an implicit instantiation to take place, in every translation unit in which such a use occurs; no diagnostic is required. If the program does not provide a definition for an explicit specialization and either the specialization is used ina way that would cause an implicit instantiation to take place or the member is a virtual member function, the program is ill-formed, no diagnostic required. On ELF platforms libginac appears to link just fine despite having two instantiations of `lst::info` since the of them (in `integration_kernel.o`) is a weak symbol: $ find ginac -type f -name '*.o' | xargs -n 1 nm --print-file-name --defined | c++filt | grep -e 'list>::info(' ginac/CMakeFiles/ginac.dir/integration_kernel.cpp.o:0000000000000000 W GiNaC::container<std::__cxx11::list>::info(unsigned int) const ginac/CMakeFiles/ginac.dir/lst.cpp.o:0000000000000000 T GiNaC::container<std::__cxx11::list>::info(unsigned int) const so the linker discards the wrong instantiation of `lst::info` method. However on MinGW there are no weak symbols (in ELF sense): $ find ginac -type f -name '*.obj' | xargs -n 1 x86_64-w64-mingw32-nm --print-file-name --defined | c++filt | grep -e 'list>::info(' ginac/CMakeFiles/ginac.dir/lst.cpp.obj:0000000000000010 T GiNaC::container<std::__cxx11::list>::info(unsigned int) const ginac/CMakeFiles/ginac.dir/integration_kernel.cpp.obj:0000000000000000 T GiNaC::container<std::__cxx11::list>::info(unsigned int) const Hence the above multiple definition error. To avoid the problem #include "lst.h" (so explicit specialization is available). While at it explicitly instantiate lst::info method in lst.cpp A better solution would be to remove declaration of lst from registrar.h, but that's too disruptive since GiNaC uses lst a lot: subs, unarchive, etc. ----------------------------------------------------------------------- Summary of changes: check/CMakeLists.txt | 4 +- check/Makefile.am | 4 ++ check/exam_function_exvector.cpp | 116 +++++++++++++++++++++++++++++++++++++++ ginac/function.cppy | 2 +- ginac/integration_kernel.h | 1 + ginac/lst.cpp | 1 + ginac/lst.h | 1 + 7 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 check/exam_function_exvector.cpp hooks/post-receive -- GiNaC -- a C++ library for symbolic computations