We've been developing an app under gcc-3.4, and
were pleased with how strictly gcc-3.4 enforced
the C++ standard :-)
But in porting to another compiler, we discovered
that gcc had let us use a nonportable construct:
Types like void*, int*, and float* are not covariant,
but gcc happily lets subclasses and superclasses
use them interchangably for return types.

The following example demonstrates the problem; it
compiles ok on gcc even with -W -Wall, but not on
ICC 8.1 or Comeau's online compiler:

typedef int type1;
typedef float type2;

class A {
  virtual ~A() {};
  virtual void * result() const = 0;
};

class B : public A {
  virtual type1 * result() const { return new type1; };
};

class C : public A {
  virtual type2 * result() const { return new type2; };
};


ICC 8.1 Errors:
Intel(R) C++ Compiler for 32-bit applications, Version 8.1    Build 20040921Z
Package ID: l_cc_pc_8.1.022

test-covarient.cc(14): error: return type is not identical to nor covariant with
return type "void *" of overridden virtual function function "A::result"
    virtual type1 * result() const { return new type1; };
                    ^

test-covarient.cc(18): error: return type is not identical to nor covariant with
return type "void *" of overridden virtual function function "A::result"
    virtual type2 * result() const { return new type2; };


Comeau Errors:
Comeau C/C++ 4.3.3 (Aug  6 2003 15:13:37) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing.  All rights reserved.
MODE:strict errors C++

"ComeauTest.c", line 10: error: return type is not identical to nor covariant with
          return type "void *" of overridden virtual function function
          "A::result"
    virtual type1 * result() const { return new type1; };
                    ^

"ComeauTest.c", line 14: error: return type is not identical to nor covariant with
          return type "void *" of overridden virtual function function
          "A::result"
    virtual type2 * result() const { return new type2; };

-- 
           Summary: gcc lets subclasses use noncovariant return types
           Product: gcc
           Version: 3.4.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: joshh at google dot com
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-unknown-linux-gnu
  GCC host triplet: i686-unknown-linux-gnu
GCC target triplet: i686-unknown-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18064

Reply via email to