On 6/15/07, Mark Mitchell <[EMAIL PROTECTED]> wrote:
So, why not:

  struct S __attribute__((visibility("hidden")) {
    void f();
    void g() __attribute__((dllimport));
  };
  void S::f() { S::g(); };

In any case, in practice, ARM's RealView compiler accepts:

  struct __declspec(notshared) S {
    __declspec(dllimport) void f();
    void g();
  };

  void S::g() {
    f();
  }

And, there's a large body of code that uses this.

Because you missed typeinfo is also hidden (not just vtables).

So if you have (which is what you showed):

struct S __attribute__((visibility("hidden")) {
  void f();
  void g() __attribute__((dllimport));
};
void S::f() { S::g(); };

The typeinfo will be hidden and only in the shared library and not
exported (and if it is then that is a bug).

So in an user program you use typeid(S), you will get a link failure.
If f and g are switch around, you will then not get a link failure but
doing a "throw S();" with a catch on the outside, will cause the throw
to be caught by a try{ .... } catch (S &a) ...

Thanks,
Andrew Pinski

Reply via email to