[tao-bugs] [compiler] CORBA::Any insertion and extraction operators

Lockhart, Thomas G (398I) Thomas.G.Lockhart at jpl.nasa.gov
Mon Oct 30 18:04:33 CDT 2017


(PRF is below)

Hi all. I’m upgrading software to new versions and am running into trouble with CORBA::Any insertion and extraction operators on g++ (on Linux) and llvm (on the Mac). Pretty sure this is an issue with new compilers, not with code generated by TAO.

My templates which use the CORBA::Any extraction operator generated in IDL is throwing a compiler error:

/proj/rtc/build/rtc/master/macosx/../rtc/rtcore/config/entry_T.cc:39:11: error: no viable overloaded '>>='
  if (!(V >>= Temp)) {

And simplifying the code gives something similar:

/proj/rtc/build/rtc/master/macosx/../rtc/rtcore/config/entry_T.cc:46:5: error: invalid operands to binary expression
      ('const CORBA::Any' and 'RTC::Configuration::LogType *')
  V >> Temp;
  ~ ^  ~~~~

On Linux there is something similar:

/proj/rtc/build/rtc/2.6.x/linux-x86_64-centos7/../rtc/rtcore/config/entry_T.cc:39:11: error: no match for ‘operator>>=’ (operand types are ‘const CORBA::Any’ and ‘RTC::Configuration::LogType*’)
   if (!(V >>= Temp)) {

The corresponding insertion operators fail also. The code in question is defined in a template. An old post on the llvm developer’s email list (can’t find it now) indicates that this is expected behavior for llvm when faced with operators defined in global namespace, and that all other compilers are wrong for continuing to accept the syntax (*sigh*).

Any hints on getting these operators to work with recent compilers? It worked up until the last few years…

PRF including example snippets are below.

Hopefully this rings a bell with someone and they have a fix for my code. Thanks!

- Tom


    TAO VERSION: 2.4.5
    ACE VERSION: 6.4.5

    HOST MACHINE and OPERATING SYSTEM: Linux, Mac OS Sierra
    COMPILER NAME AND VERSION (AND PATCHLEVEL):
Apple LLVM version 9.0.0 (clang-900.0.38)

g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)

    THE $ACE_ROOT/ace/config.h FILE [if you use a link to a platform-
    specific file, simply state which one]:

config.h:
#include “ace/config-macosx-sierra.h”

config-macosx-sierra.h:
#ifndef ACE_CONFIG_MACOSX_SIERRA_H
#define ACE_CONFIG_MACOSX_SIERRA_H
#include "ace/config-macosx-elcapitan.h"
#undef ACE_LACKS_CLOCKID_T
#undef ACE_LACKS_CLOCK_MONOTONIC
#undef ACE_LACKS_CLOCK_REALTIME
#endif // ACE_CONFIG_MACOSX_SIERRA_H

    THE $ACE_ROOT/include/makeinclude/platform_macros.GNU FILE:
buildbits=64
universal=0
install_rpath=0
inline=1
shared_libs_only=1
ec_typed_events=0
ssl=0
LDFLAGS+= -Wl,-rpath,$(INSTALL_PREFIX)/$(INSTALL_LIB)
SOFLAGS+= -Wl,-install_name,\@rpath/$@
include $(ACE_ROOT)/include/makeinclude/platform_macosx_sierra.GNU

    AREA/CLASS/EXAMPLE AFFECTED:
CORBA::Any insertion and extraction operators generated by tao_idl.

    DOES THE PROBLEM AFFECT:
        COMPILATION?
Yes

    SYNOPSIS:
Insertion and extraction operators (and probably others) from generated IDL code when used in templates.

    DESCRIPTION:
We use CORBA::Any to carry data in our telemetry system based on CORBA event channels. The actual implementation is fairly deeply nested to support configurable objects. But the failing functionality is in trying to insert or extract structured values from a CORBA::Any.

    REPEAT BY:
IDL definitions:
module RTC {
  module Configuration {
    struct LogElement {
      any Value;  ///< Value of the entry
      long long llTime;  ///< Time that the entry was changed
    };
    typedef sequence<LogElement> LogType;
    typedef sequence<LogType> LogSequenceType;
  };
};

template<class T>
bool
RTC::Configuration::StructuredEntryModifier<T>::
SetValue(const CORBA::Any& V, T& ValueToSet)
{
  T* Temp;
  if (!(V >>= Temp)) {
    return false;
  } else {
    ValueToSet = *Temp;
  }
  return true;
}

    SAMPLE FIX/WORKAROUND:
None yet but this is a known issue.


More information about the tao-bugs mailing list