As it turns out, I must use the Solaris Studio compiler to take advantage of OpenMP on Solaris. This compiler is much more picky in terms of not allowing certain non-standard constructs.
Here are the problems I've had:
Enum values must be a long or unsigned long
In SystemLimits.hh, LARGE_INT and SMALL_INT are declared as type long long (with the LL suffix). This is actually not allowed.
I would like to suggest using a namespace and constant variables instead. (if this is done in other cases as well, this would get rid of all the warnings the compiler emits when assigning a value to an enum that has not been previously declared).
Zero-size arrays are not allowed
In CDR_string.hh, the dim member is declared of size 0. This is allowed by GCC as an extension, but is non-standard. There is an flag that enables this extension in the Solaris compiler too, but it may be a good idea to remove this altogether if possible.
If not, the Solaris Studio flag that is needed is: -features=zla
The same thing happens in ValueHistory.cc when value history is disabled (since VALUEHISTORY_SIZE becomes 0).
C++ does not support non-constant array sizes
Declaring an array with a size computed at runtime is not actually allowed (it's supported in modern C, and also supported in C++ as an extension).
The solution is to use alloca() instead. I.e, change the following:
int foo[bar];
to:
int *foo = (int *)alloca(sizeof(int) * bar);
This happens at:
- APmain.cc:290
- AP210.cc:151 and 192
- Archive.cc:318
- LibPaths.cc:74 and 81
- PrimitiveFunction.cc:2285, 2329 and 2940
- QuadFunction.cc:1465
- Quad_SVx.cc:268
- SkalarFunction.cc:505
- Symbol.cc:205 and 764
- SystemVariable.cc:553
The option -g2 is illegal, in src/APs/Makefile
I'm not sure what this option does even in GCC, but Solaris Studio does not accept it.
Overloading ambiguity for maths functions
The following errors are fixed by casting the inner argument to double:
"IntCell.cc", line 222: Error: Overloading ambiguity between "std::exp(double)" and "std::exp(float)".
"IntCell.cc", line 234: Error: Overloading ambiguity between "std::log(double)" and "std::log(float)".
"IntCell.cc", line 234: Error: Overloading ambiguity between "std::log(double)" and "std::log(float)".
"IntCell.cc", line 230: Error: Overloading ambiguity between "std::log(double)" and "std::log(float)".
"IntCell.cc", line 234: Error: Overloading ambiguity between "std::log(double)" and "std::log(float)".
The include file <locale.h> needs to be included to access the LC_ symbols
This file needs to be included from SystemVariable.cc
munmap() does not follow POSIX
By default, Solaris expects the first argument to munmap() to be a char * as opposed to void *. This is non-standard, but standard behaviour can be achieved by setting the #define _XPG4_2
However... Doing this causes some other issues so it might just be best to #ifdef that thing and cast the argument to char * on Solaris.
Regards,
Elias