[Bug c++/90942] New: Attributes

mail at 3v1n0 dot net gcc-bugzilla@gcc.gnu.org
Wed Jun 19 16:03:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90942

            Bug ID: 90942
           Summary: Attributes
           Product: gcc
           Version: 8.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mail at 3v1n0 dot net
  Target Milestone: ---

Use something like this:

// Test case, wrongexport.cpp
// g++ -shared -fPIC -o /tmp/libwrong.so wrongexport.cpp -fvisibility=hidden
// nm -DC /tmp/libwrong.so | grep Astruct # misses AStruct<int> in gcc!!!

#define EXPORT __attribute__ ((visibility ("default")))

template <typename T>
struct AStruct {
    AStruct(T) {}
};

template struct EXPORT AStruct<bool>;

void ImplicitSpecializationDefinition(AStruct<int>) {}

// Ignored in g++, clang++ will export it
template struct EXPORT AStruct<int>;

---

When compiled with clang++:
 - No error
 - Exported symbols are (as expected):
0000000000001110 W AStruct<bool>::AStruct(bool)
0000000000001110 W AStruct<bool>::AStruct(bool)
0000000000001130 W AStruct<int>::AStruct(int)
0000000000001130 W AStruct<int>::AStruct(int)


When compiled with g++:
 - Warns:
 /tmp/wrongexport.cpp:17:24: warning: type attributes ignored after type is
already defined [-Wattributes]
 template struct EXPORT AStruct<int>;
                        ^~~~~~~~~~~~
 - Exported symbols are:
000000000000059c W AStruct<bool>::AStruct(bool)
000000000000059c W AStruct<bool>::AStruct(bool)

So, it's missing the symbols for AStruct<int>::AStruct(int) because the fact
that is used as parameter, cause an implicit definition with default
attributes.

I think that in such case g++ should instead allow to define attributes at
later point when those are not explicitly set.

This affects mozjs https://bugzilla.mozilla.org/show_bug.cgi?id=1560064


More information about the Gcc-bugs mailing list