Programs with base classes from the C++ Standard Library compiled using -qobjmodel=ibm produces "1540-2200" error

Technote (troubleshooting)


Problem(Abstract)

Compiling programs with base classes from the C++ Standard Library using the IBM object model -qobjmodel=ibm option using XL C/C++ compiler on AIX and z/OS produces "1540-2200" error.

Symptom

Compiling the following example with the -qobjmodel=ibm option on AIX and z/OS will result in an error message indicating that the base classes have different object models.

#include <functional>

struct dummy_range_checker{};

struct trivial_converter_impl:

public std::unary_function<int, bool>,

public dummy_range_checker

{}; 

Use the following command to compile the example:

xlC t.cpp -qobjmodel=ibm -c

The following error message is generated by the compiler:

"t.cpp", line 5.8: 1540-2200 (S) Class "trivial_converter_impl" has base classes with different object models.

Cause

There is a limitation of using -qobjmodel=ibm with base classes from the C++ Standard Library.

All classes in the same inheritance hierarchy must have the same object model.

There are two object models available in the XL C++ compiler on AIX and z/OS:

  • IBM object model, which can be specified by the -qobjmodel=ibm option or the #pragma object_model(ibm) pragma
  • The classic object model, which can be specified by the -qobjmodel=classic option or the #pragma object_model(classic) pragma

The "1540-2200" error arises because:

  • The std::unary_function base class has the classic object model since the C++ Standard Library from the XL C/C++ compiler headers on AIX and z/OS specifies #pragma object_model(classic) in the source code header.
  • The dummy_range_checker base class has the ibm object model since the -qobjmodel=ibm option was used on the command line.

Thus the trivial_converter_impl derived class has conflicting object models.

Resolving the problem

The -qobjmodel=ibm option cannot be used to compile program source with base classes from the C++ Standard Library on AIX and z/OS.

You can use -qobjmodel=classic which is the default.

Related information

-qobjmodel

Cross reference information
Segment Product Component Platform Version Edition
Software Development z/OS XL C/C++ Compiler z/OS All Versions Not Applicable

Rate this page:

(0 users)Average rating

Document information


More support for:

XL C/C++ for AIX
Compiler

Software version:

12.1

Operating system(s):

AIX

Reference #:

1620358

Modified date:

2012-12-21

Translate my page

Machine Translation

Content navigation