[GiNaC-devel] [SCM] GiNaC -- a C++ library for symbolic computations branch, master, updated. release_1-4-0-708-ga569b474

Richard B. Kreckel git at ginac.de
Wed Jan 6 16:45:14 CET 2021


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 at 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 at 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


More information about the GiNaC-devel mailing list