V5-34-09 compilation dies on a SLC4 / i686

While trying to compile ROOT v5-34-09 on a SLC4 / i686 machine with gcc 3.4.6, I get:

bin/rmkdepend -R -fio/io/src/TStreamerInfoActions.d -Y -w 1000 – -pipe -m32 -Wall -W -Woverloaded-virtual -fPIC -Iinclude -pthread -D__cplusplus – /…/io/io/src/TStreamerInfoActions.cxx
g++ -O2 -pipe -m32 -Wall -W -Woverloaded-virtual -fPIC -Iinclude -pthread -o io/io/src/TStreamerInfoActions.o -c /…/io/io/src/TStreamerInfoActions.cxx
/…/io/io/src/TStreamerInfoActions.cxx: In function `TStreamerInfoActions::TConfiguredAction GetCollectionReadAction(TVirtualStreamerInfo*, TStreamerElement, Int_t, UInt_t, Int_t) [with Looper = TStreamerInfoActions::VectorLooper]’:
/…/io/io/src/TStreamerInfoActions.cxx:2722: instantiated from here
/…/io/io/src/TStreamerInfoActions.cxx:2126: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See URL:http://bugzilla.redhat.com/bugzilla for instructions.
Preprocessed source stored into /tmp/ccBlahBlah.out file, please attach this to your bugreport.
make: *** [io/io/src/TStreamerInfoActions.o] Error 1

This happens also when one tries “–build=debug” (i.e. “-g” instead of “-O2”).

Any ideas how to fix it?

This problem has been introduced in the “v5-34-00-patches” svn revision “48931” (2013-03-25 16:43:38 UTC) which is the git commit “87370d19…”.
It is a result of a significant redesign of the “io/io/src/TStreamerInfoActions.cxx” internal logic that started with the “v5-34-00-patches” svn revision “48911” (2013-03-21 23:44:26 UTC) which is the git commit “13b8a3b9…”.
That means that one can still safely use the “v5-34-00-patches” svn revision “48910” (2013-03-21 23:41:50 UTC), which is the git commit “4ee07757…”:
svn co -r 48910 root.cern.ch/svn/root/branches/v5-34-00-patches
That is about 5 weeks newer than the “v5-34-05” release (“v5-34-00-patches” svn revision “48581”, 2013-02-14 22:25:27 UTC, which is the git commit “5fa52b37…”).

Hi,

I am afraid this essentially means we can no longer support gcc 3.4.6. I currently do not access to any machine with this old version of the compiler installed to try to find a work-around. (See line 2126 of TStreamerInfoActions.cxx, this is a bit of convoluted but standard C++ template programming necessary to avoid code duplication while improving performance )

If you do find a simple work-around we would add it to the repository (behind #If).

Cheers,
Philippe.

Well, give me a “less convoluted” version and I will try it.

Hi,

Well the code we currently use is the least convoluted (i.e. cleanest) that does work on the current crop of platform (SLC5,6) that we primarily support. Coming up with a version that works on an old broken compiler that I do not have access to would be both time consuming and resulting in a worse solution.

Cheers,
Philippe.

I’d like to rewrite: return TConfiguredAction( Looper::template ReadAction<ConvertBasicType<float,double>::Action >, new TConfiguration(info,i,offset) ); into something like: MAGIC_ACTION_TYPE action_tmp = Looper::template ReadAction<ConvertBasicType<float,double>::Action >; TConfiguration *conf_tmp = new TConfiguration(info,i,offset); return TConfiguredAction( action_tmp, conf_tmp ); but somehow I cannot guess the correct “MAGIC_ACTION_TYPE”. Could you, please, tell me what it should be?

Hi,

Depending on the type of ‘Looper’ it can be either TStreamerInfoVecPtrLoopAction_t or TStreamerInfoLoopAction_t. To do what you are trying to do you may have to add a typedef to VectorLooper, VectorPtrLooper and GenericLooper (so you can use it in place of MAGIC_ACTION_TYPE)

Cheers,
Philippe.