Usage of designated initializer in factor.cpp forces c++20 on GiNaC
Dear all, congratulations for this amazing software. I was struggling a little bit to make it work in CMake, with many linking errors in windows (for linux it was easy, but I need both working) so I recently created a simple Bazel build file for the projects CLN and GINAC, to debug the error. In the end, I managed to find and fix the error, so I wanted you to know that the file factor.cpp from GiNaC is using designated initializers, which is only part of c++20... and when I activated c++20 here, the linking was broken on windows! So, a solution was to change (around line 2344): factorization_ctx ctx = {.poly = poly, .x = x, .syms_wox = syms_wox}; And transform into this: factorization_ctx ctx{poly, x, syms_wox}; After that, I can enable c++17 and it works on GCC, Clang and MSVC! For GCC and Clang, they don't complain on designated initializers, even if it's c++17 standard... So, since it's the only thing from c++20, you should consider if it's work activating a whole new standard just because of this, or to consider that the project is already c++20. I personally love c++20, but it's important to notice that some fundamental things change... for example, I just discovered that the code works in c++20 in windows, but with /permissive flag, otherwise it gives crazy LNK2019 linking errors. I believe some ABI has changed after c++17, but it was hard to understand and fix the error. So, best regards and I hope this information is useful! Igor
Hi Igor, Thank you for pointing out this little transgression of the language standard version. On 10/1/23 00:57, Igor Machado wrote:
In the end, I managed to find and fix the error, so I wanted you to know that the file factor.cpp from GiNaC is using designated initializers, which is only part of c++20... and when I activated c++20 here, the linking was broken on windows! So, a solution was to change (around line 2344): factorization_ctx ctx = {.poly = poly, .x = x, .syms_wox = syms_wox}; And transform into this: factorization_ctx ctx{poly, x, syms_wox};
After that, I can enable c++17 and it works on GCC, Clang and MSVC! For GCC and Clang, they don't complain on designated initializers, even if it's c++17 standard...
It is not worth pulling in C++20 for this. We'll change it to a brace-closed initializer list as you suggest. All my best, -richy. -- Richard B. Kreckel <https://in.terlu.de/~kreckel/>
Thanks for the response Richard.. I had myself to do the same recently on a c++17 project that I have, which is also c++20 friendly. But I also discovered that c++20 still has some issues in some current popular systems, such as google colab, so I was also forced to remove this nice feature. I can suggest you, if not using yet, to put flag -pedantic on g++, so that it will force the project to be iso compatible, otherwise it wont complain (but I dont know how to do it cross compiler, like msvc flags, g++, clang and so on.. very hard c++ world :D hahaha) Best regards! Igor Em sáb., 28 de out. de 2023 23:57, Richard B. Kreckel <kreckel@in.terlu.de> escreveu:
Hi Igor,
Thank you for pointing out this little transgression of the language standard version.
On 10/1/23 00:57, Igor Machado wrote:
In the end, I managed to find and fix the error, so I wanted you to know that the file factor.cpp from GiNaC is using designated initializers, which is only part of c++20... and when I activated c++20 here, the linking was broken on windows! So, a solution was to change (around line 2344): factorization_ctx ctx = {.poly = poly, .x = x, .syms_wox = syms_wox}; And transform into this: factorization_ctx ctx{poly, x, syms_wox};
After that, I can enable c++17 and it works on GCC, Clang and MSVC! For GCC and Clang, they don't complain on designated initializers, even if it's c++17 standard...
It is not worth pulling in C++20 for this. We'll change it to a brace-closed initializer list as you suggest.
All my best, -richy. -- Richard B. Kreckel <https://in.terlu.de/~kreckel/>
participants (2)
-
Igor Machado
-
Richard B. Kreckel