From: Danny Smith Date: Fri, 4 Jul 2003 07:52:38 +0000 (+0000) Subject: PR c++/5287, PR c++/7910, PR c++/11021 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1cf0dce8a86d805c20a520445f3728a5c721fe2f;p=gcc.git PR c++/5287, PR c++/7910, PR c++/11021 PR c++/5287, PR c++/7910, PR c++/11021 * testsuite/g++.dg/ext/dllimport1.C: Add mingw32 as target. Add tests for warnings. * testsuite/g++.dg/ext/dllimport2.C: Add tests for warnings. * testsuite/g++.dg/ext/dllimport3.C: Likewise. * testsuite/g++.dg/ext/dllimport4.C: New file. * testsuite/g++.dg/ext/dllimport5.C: New file. * testsuite/g++.dg/ext/dllimport6.C: New file. * testsuite/g++.dg/ext/dllimport7.C: New file. * testsuite/g++.dg/ext/dllimport8.C: New file. * testsuite/g++.dg/ext/dllimport9.C: New file. * testsuite/g++.dg/ext/dllimport10.C: New file. * testsuite/g++.dg/ext/dllexport1.C: New file. From-SVN: r68917 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 344cb3976e8..9734bdf668a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,19 @@ +2003-07-04 Danny Smith + + PR c++/5287, PR c++/7910, PR c++/11021 + * testsuite/g++.dg/ext/dllimport1.C: Add mingw32 as target. Add + tests for warnings. + * testsuite/g++.dg/ext/dllimport2.C: Add tests for warnings. + * testsuite/g++.dg/ext/dllimport3.C: Likewise. + * testsuite/g++.dg/ext/dllimport4.C: New file. + * testsuite/g++.dg/ext/dllimport5.C: New file. + * testsuite/g++.dg/ext/dllimport6.C: New file. + * testsuite/g++.dg/ext/dllimport7.C: New file. + * testsuite/g++.dg/ext/dllimport8.C: New file. + * testsuite/g++.dg/ext/dllimport9.C: New file. + * testsuite/g++.dg/ext/dllimport10.C: New file. + * testsuite/g++.dg/ext/dllexport1.C: New file. + 2003-07-03 Mark Mitchell * g++.old-deja/g++.jason/typeid1.C: Add dg-error marker. diff --git a/gcc/testsuite/g++.dg/ext/dllexport1.C b/gcc/testsuite/g++.dg/ext/dllexport1.C new file mode 100644 index 00000000000..5f065d4a94a --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllexport1.C @@ -0,0 +1,23 @@ +// Test that inline functions are exported with -fkeep-inline-functions. +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } +// { dg-options -fkeep-inline-functions } + +__attribute__((dllexport)) inline int foo (int a) { return a;} + + +class __attribute__((dllexport)) Bar +{ + public: + Bar(){}; + int inline_bar(int a) {return a;} + int outline_bar(int a); +}; + +int Bar::outline_bar(int a) {return foo (a);} + + +Bar abar; + +// { dg-final { scan-assembler "\.section\[ \t\]*.drectve\n.*_ZN3Bar11outline_barEi" } } +// { dg-final { scan-assembler " -export:_ZN3Bar10inline_barEi" } } +// { dg-final { scan-assembler " -export:_Z3fooi" } } diff --git a/gcc/testsuite/g++.dg/ext/dllimport1.C b/gcc/testsuite/g++.dg/ext/dllimport1.C index a93fb1927d6..844c92ebc5a 100644 --- a/gcc/testsuite/g++.dg/ext/dllimport1.C +++ b/gcc/testsuite/g++.dg/ext/dllimport1.C @@ -1,12 +1,20 @@ -// { dg-do compile { target i?86-*-cygwin* } } +// PR c++/7910 +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } +// { dg-options { -Wall -W } } class __attribute__((dllimport)) Foo { public: virtual void dummy_foo_func(void) - {} + {} // { dg-warning "inline function" } + void Foo::dummy_foo_fun2(); + virtual ~Foo(); // avoid warning }; +void Foo::dummy_foo_fun2() +{ // { dg-warning "defined" } +} + class Bar : public Foo { public: @@ -19,3 +27,5 @@ Bar::~Bar() void Bar::dummy_bar_func() {} + +// { dg-final { scan-assembler-not "__imp___ZN3Foo14dummy_foo_fun" } } diff --git a/gcc/testsuite/g++.dg/ext/dllimport10.C b/gcc/testsuite/g++.dg/ext/dllimport10.C new file mode 100644 index 00000000000..c8aaf228a83 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport10.C @@ -0,0 +1,16 @@ +// PR c++/5287, c++/11021 +// Inherit a virtual method from a dllimport'd base class. + +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } + +struct __attribute__((dllimport)) A +{ + virtual void vfunc(void); +}; + +struct B : public A +{ +}; + + +B aB; diff --git a/gcc/testsuite/g++.dg/ext/dllimport2.C b/gcc/testsuite/g++.dg/ext/dllimport2.C index 9564be4f74c..8acad5b0d76 100644 --- a/gcc/testsuite/g++.dg/ext/dllimport2.C +++ b/gcc/testsuite/g++.dg/ext/dllimport2.C @@ -1,15 +1,29 @@ // { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } -// PR 9738 Dllimport attribute is overriden by later definition +// PR c++/9738 Dllimport attribute is overriden by later definition/redeclaration void __attribute__((dllimport)) Bar(void); +void __attribute__((dllimport)) Baz(void); +__attribute__((dllimport)) int Biz; +__attribute__((dllimport)) int Boz; + +void Foo(void) + { + Bar(); + Baz(); + Biz++; + Boz++; + } - void Foo(void) - { - Bar(); - } - - void Bar(void) - { - } - +void Bar(void) + { // { dg-warning "defined" } + } + +void Baz(void); // { dg-warning "redeclared" } +extern int Biz; // { dg-warning "redeclared" } +int Boz; // { dg-warning "defined" } + +void foo() +{ + Biz++; +} diff --git a/gcc/testsuite/g++.dg/ext/dllimport3.C b/gcc/testsuite/g++.dg/ext/dllimport3.C index d5e7955dbff..5a13a509d4f 100644 --- a/gcc/testsuite/g++.dg/ext/dllimport3.C +++ b/gcc/testsuite/g++.dg/ext/dllimport3.C @@ -15,7 +15,7 @@ struct Foo void* dummy = &f; } - struct Foo f; + struct Foo f; // { dg-warning "defined" } // Dllimport sets DECL_NON_ADDR_CONST_P to 1, so following // assignment would require static_initialization_and_destruction diff --git a/gcc/testsuite/g++.dg/ext/dllimport4.C b/gcc/testsuite/g++.dg/ext/dllimport4.C new file mode 100644 index 00000000000..f61773b89a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport4.C @@ -0,0 +1,6 @@ +// Report error if dllimport attribute in definition itself. +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } + +__attribute__((dllimport)) void bar () { } // { dg-error "definition" } + +__attribute__((dllimport)) int foo = 1; // { dg-error "definition" } diff --git a/gcc/testsuite/g++.dg/ext/dllimport5.C b/gcc/testsuite/g++.dg/ext/dllimport5.C new file mode 100644 index 00000000000..8e6f166295e --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport5.C @@ -0,0 +1,28 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } +// Report error if static symbol definition has dllimport attribute. + +__attribute__((dllimport)) + int impvar; // OK, implicit "extern" + + static __attribute__((dllimport)) + int static_impvar; // { dg-error "external linkage" } + + static __attribute__((dllexport)) +int static_expvar; // { dg-error "external linkage" } + +static __attribute__((dllimport)) +void static_impfun(void); // { dg-error "external linkage" } + +void foo() +{ + __attribute__((dllimport)) + int foovar; // OK, implicit "extern" + foovar++; +} + +void bar() +{ + __attribute__((dllexport)) + int barvar; // { dg-error "external linkage" } + barvar++; +} diff --git a/gcc/testsuite/g++.dg/ext/dllimport6.C b/gcc/testsuite/g++.dg/ext/dllimport6.C new file mode 100644 index 00000000000..3b2a082f9b2 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport6.C @@ -0,0 +1,30 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } +// Mark class static members as dllimport. + +struct Baz +{ + Baz(int a_ =0) : a(a_) {}; + int a; +}; + +class __attribute__ ((dllimport)) Bar +{ + public: + static const int two = 2; + static const int three; + static const Baz null_baz; +}; + +int foo() +{ + Bar foobar; + const int* baz = &Bar::two; + int a = foobar.two; + int b = foobar.three; + int c = foobar.null_baz.a; + return (a + b + c + *baz); +} + +// { dg-final { scan-assembler __imp___ZN3Bar3twoE } } +// { dg-final { scan-assembler __imp___ZN3Bar5threeE } } +// { dg-final { scan-assembler __imp___ZN3Bar8null_bazE } } diff --git a/gcc/testsuite/g++.dg/ext/dllimport7.C b/gcc/testsuite/g++.dg/ext/dllimport7.C new file mode 100644 index 00000000000..fa76d3eec8c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport7.C @@ -0,0 +1,33 @@ +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } + +// Report errors on definition of dllimport'd static data member . + + +struct Baz +{ + Baz(int a_ =0) : a(a_) {}; + int a; +}; + +class __declspec(dllimport) Bar +{ + public: + enum {one = 1}; + static const int two = 2; + static const int three; + static const Baz null_baz; +}; + +const int Bar::three = 3; // { dg-error "definition of static data" } +const Baz Bar::null_baz; // { dg-error "definition of static data" } + + +int foo() +{ + Bar foobar; + const int* baz = &Bar::two; + int a = foobar.two; + int b = foobar.three; + int c = foobar.null_baz.a; + return (a + b + c + *baz); +} diff --git a/gcc/testsuite/g++.dg/ext/dllimport8.C b/gcc/testsuite/g++.dg/ext/dllimport8.C new file mode 100644 index 00000000000..9052831774b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport8.C @@ -0,0 +1,29 @@ +// PR c++/8378 +// Ignore dllimport of static members if marked inlined. +// or if definition follows declaration in dllimported class. + +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } +// { dg-options { -Wall -W } } + +struct __attribute__((dllimport)) Foo + { + static int static_int; + static void static_func1(); + static void static_func2(); + }; + +void Foo::static_func1() + { // { dg-warning "defined" } + } + +inline void Foo::static_func2() + { // { dg-warning "inline function" } + } + +void testfoo() +{ + Foo::static_func1(); + Foo::static_func2(); +} + +// { dg-final { scan-assembler-not "__imp__" } } diff --git a/gcc/testsuite/g++.dg/ext/dllimport9.C b/gcc/testsuite/g++.dg/ext/dllimport9.C new file mode 100644 index 00000000000..edf79efd8d1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/dllimport9.C @@ -0,0 +1,23 @@ +// Handle dllimport attribute for functions declared inline. +// { dg-do compile { target i?86-*-cygwin* i?86-*-mingw*} } +// { dg-options { -W } } + +inline __attribute__((dllimport)) void bar() { } // { dg-warning "inline" } + +struct __attribute__ ((dllimport)) Blah +{ + void in_blah () { } // { dg-warning "inline" } + void out_blah (); +}; + +inline void Blah::out_blah(){ } // { dg-warning "inline" } + +void use_inlines() +{ + Blah aBlah; + bar(); + aBlah.in_blah (); + aBlah.out_blah (); +} + +// { dg-final { scan-assembler-not "__imp__" } }