diff options
Diffstat (limited to 'gcc/testsuite')
22 files changed, 145 insertions, 49 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dd221c85ed0..a04b598e47b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,30 @@ +2004-08-05 Mark Mitchell <mark@codesourcery.com> + + * g++.dg/ext/visibility/assign1.C: Use scan-hidden and + dg-require-visiblity. + * g++.dg/ext/visibility/fvisibility-inlines-hidden.C: Likewise. + * g++.dg/ext/visibility/fvisibility.C: Likewise. + * g++.dg/ext/visibility/memfuncts.C: Likewise. + * g++.dg/ext/visibility/new1.C: Likewise. + * g++.dg/ext/visibility/pragma.C: Likewise. + * g++.dg/ext/visibility/staticmemfuncts.C: Likewise. + * g++.dg/ext/visibility/virtual.C: Likewise. + * g++/dg/ext/visibility/visibility-1.C: Likewise. + * g++/dg/ext/visibility/visibility-2.C: Likewise. + * g++/dg/ext/visibility/visibility-3.C: Likewise. + * g++/dg/ext/visibility/visibility-4.C: Likewise. + * g++/dg/ext/visibility/visibility-5.C: Likewise. + * g++/dg/ext/visibility/visibility-6.C: Likewise. + * g++/dg/ext/visibility/visibility-7.C: Likewise. + * g++/dg/ext/visibility/visibility-8.C: New test. + * gcc.c-torture/compile/dll.x: Remove. + * gcc.dg/dll-2.c: Use dg-require-dll + * gcc.dg/visibility-10.c: New test. + * lib/gcc-dg.exp (dg-require-dll): Add Symbian to list of targets + supporting DLLs. + * testsuite/lib/scanasm.exp (scan_hidden): New function. + (scan_not_hidden): Likewise. + 2004-08-05 David Edelsohn <edelsohn@gnu.org> * gcc.dg/sh4a-fprun.c: Fix dg-do typo. diff --git a/gcc/testsuite/g++.dg/ext/visibility/assign1.C b/gcc/testsuite/g++.dg/ext/visibility/assign1.C index 6d7392fd04b..cbd909ee191 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/assign1.C +++ b/gcc/testsuite/g++.dg/ext/visibility/assign1.C @@ -1,6 +1,6 @@ /* { dg-do compile } */ /* { dg-require-visibility "" } */ -/* { dg-final { scan-assembler "\\.hidden.*_ZN1DaSERKS_" } } */ +/* { dg-final { scan-hidden "_ZN1DaSERKS_" } } */ struct B { B& operator=(const B&); diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C index 4b610229b46..2ee8f0767ba 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C +++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C @@ -2,7 +2,7 @@ /* { dg-do compile } */ /* { dg-require-visibility "" } */ /* { dg-options "-fvisibility-inlines-hidden" } */ -/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ class Foo { diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C index fd2c7e2fc3e..4358d25a960 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C +++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C @@ -2,7 +2,7 @@ /* { dg-do compile } */ /* { dg-require-visibility "" } */ /* { dg-options "-fvisibility=hidden" } */ -/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ class Foo { diff --git a/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C b/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C index 19a5c9d506b..45eb641b29e 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C +++ b/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C @@ -1,7 +1,7 @@ /* Test that setting visibility for class member functions works. */ /* { dg-do compile } */ /* { dg-require-visibility "" } */ -/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ class __attribute__ ((visibility ("hidden"))) Foo { diff --git a/gcc/testsuite/g++.dg/ext/visibility/new1.C b/gcc/testsuite/g++.dg/ext/visibility/new1.C index 0f0be5148da..ec201cbc20d 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/new1.C +++ b/gcc/testsuite/g++.dg/ext/visibility/new1.C @@ -1,7 +1,6 @@ -// { dg-require-visibility } -// { dg-do compile } +// { dg-require-visibility "" } // { dg-options "-fvisibility=hidden" } -// { dg-final { scan-assembler-not "\\.hidden\[^\n\]*_Znwj" } } +// { dg-final { scan-not-hidden "_Znwj" } } void f() { new int; diff --git a/gcc/testsuite/g++.dg/ext/visibility/pragma.C b/gcc/testsuite/g++.dg/ext/visibility/pragma.C index 860b2284e15..98384c9c42a 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/pragma.C +++ b/gcc/testsuite/g++.dg/ext/visibility/pragma.C @@ -1,7 +1,7 @@ /* Test that #pragma GCC visibility affects class members. */ /* { dg-do compile } */ /* { dg-require-visibility "" } */ -/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ #pragma GCC visibility push(hidden) class Foo diff --git a/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C b/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C index b49cbd5bab9..e745caa5a74 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C +++ b/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C @@ -1,7 +1,7 @@ /* Test that setting visibility for static class member functions works. */ /* { dg-do compile } */ /* { dg-require-visibility "" } */ -/* { dg-final { scan-assembler "\\.hidden.*Foo.methodEv" } } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ class __attribute__ ((visibility ("hidden"))) Foo { diff --git a/gcc/testsuite/g++.dg/ext/visibility/virtual.C b/gcc/testsuite/g++.dg/ext/visibility/virtual.C index 604c552bcb6..746c489d0b1 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/virtual.C +++ b/gcc/testsuite/g++.dg/ext/visibility/virtual.C @@ -1,7 +1,7 @@ /* Test that setting visibility for class affects virtual table. */ /* { dg-do compile } */ /* { dg-require-visibility "" } */ -/* { dg-final { scan-assembler "\\.hidden.*ZTV3Foo" } } */ +/* { dg-final { scan-hidden "ZTV3Foo" } } */ class __attribute__ ((visibility ("hidden"))) Foo { diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C index d579eb27206..8ea270bf8c0 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C @@ -1,6 +1,6 @@ /* Test visibility attribute on function definition. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3foov" } } */ void __attribute__((visibility ("hidden"))) diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C index 89e853c4dc5..26272abb1f9 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C @@ -1,6 +1,6 @@ /* Test that visibility attribute on declaration extends to definition. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3foov" } } */ void __attribute__((visibility ("hidden"))) foo(); diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C index d0cc8912efb..e4f499fccb0 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C @@ -1,6 +1,6 @@ /* Test visibility attribute on forward declaration of global variable */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "xyzzy" } } */ int __attribute__((visibility ("hidden"))) diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C index d217bc9ec5d..f6765958709 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C @@ -1,6 +1,6 @@ /* Test visibility attribute on forward declaration of global variable */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "xyzzy" } } */ extern int __attribute__ ((visibility ("hidden"))) xyzzy; diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C index 9cdc8021e47..592529e665d 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C @@ -1,7 +1,7 @@ /* Test visibility attribute on definition of a function that has already had a forward declaration. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3foov" } } */ void foo(); diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C index 6e8f0ce1135..0fecf6b74e9 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C @@ -1,7 +1,7 @@ /* Test visibility attribute on definition of global variable that has already had a forward declaration. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "xyzzy" } } */ extern int xyzzy; diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C index 40acb72463f..dbd7010d028 100644 --- a/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C @@ -1,6 +1,6 @@ /* Test warning from conflicting visibility specifications. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "xyzzy" } } */ extern int __attribute__((visibility ("hidden"))) diff --git a/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C b/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C new file mode 100644 index 00000000000..f6487263975 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/visibility-8.C @@ -0,0 +1,45 @@ +// Test that a definition marked with dllexport has default +// visibility. +// { dg-require-visibility "" } +// { dg-require-dll "" } +// { dg-options "-fvisibility=hidden" } +// { dg-final { scan-not-hidden "_ZN1A1fEv" } } +// { dg-final { scan-not-hidden "_Z1gv" } } +// { dg-final { scan-not-hidden "_Z1hv" } } +// { dg-final { scan-not-hidden "_ZN1B1iEv" } } +// { dg-final { scan-not-hidden "_ZN1B1jEv" } } +// { dg-final { scan-not-hidden "_ZN1A1a" } } +// { dg-final { scan-not-hidden "_ZN1B1b" } } +// { dg-final { scan-not-hidden "k" } } +// { dg-final { scan-not-hidden "l" } } + +struct __declspec(dllexport) A { + void f(); + static int a; +}; + +void A::f() {} + +int A::a; + +__declspec(dllexport) void g() {} + +__declspec(dllexport) void h(); +void h() {} + +struct B { + void i(); + __declspec(dllexport) void j(); + __declspec(dllexport) static int b; +}; + +__declspec(dllexport) void B::i() {} + +void B::j() {} + +int B::b; + +__declspec(dllexport) int k; + +__declspec(dllexport) extern int l; +int l; diff --git a/gcc/testsuite/gcc.c-torture/compile/dll.x b/gcc/testsuite/gcc.c-torture/compile/dll.x deleted file mode 100644 index 63a1e180e2c..00000000000 --- a/gcc/testsuite/gcc.c-torture/compile/dll.x +++ /dev/null @@ -1,20 +0,0 @@ -# This test examines the attribute support for DLLs. -# Only COFF/PE formats support DLLs, (plus, as a special case -# the mcore-elf toolchain), so the code here tries to determine -# the file format and decide whether the test should be marked -# as unsupported. - -set torture_eval_before_compile { - - if ![istarget "mcore-*-elf"] { - - set objformat [gcc_target_object_format] - - if { $objformat != "pe" } { - unsupported "dll.c" - return 1 - } - } -} - -return 0 diff --git a/gcc/testsuite/gcc.dg/dll-2.c b/gcc/testsuite/gcc.dg/dll-2.c index 45456ce8330..00c683a728c 100644 --- a/gcc/testsuite/gcc.dg/dll-2.c +++ b/gcc/testsuite/gcc.dg/dll-2.c @@ -8,9 +8,7 @@ In C, it's ok to redeclare a variable so this works for variables and functions. In C++, it only works for functions. */ -/* { dg-do compile { target arm*-*-pe* } } */ -/* { dg-do compile { target i?86-pc-cygwin } } */ -/* { dg-do compile { target i?86-pc-mingw* } } */ +/* { dg-require-dll } */ __declspec (dllimport) int foo1 (); __declspec (dllexport) int foo1 (); diff --git a/gcc/testsuite/gcc.dg/visibility-10.c b/gcc/testsuite/gcc.dg/visibility-10.c new file mode 100644 index 00000000000..d86ce1b1a30 --- /dev/null +++ b/gcc/testsuite/gcc.dg/visibility-10.c @@ -0,0 +1,19 @@ +/* Test that a definition marked with dllexport has default + visibility. */ +/* { dg-require-visibility "" } */ +/* { dg-require-dll "" } */ +/* { dg-options "-fvisibility=hidden" } */ +/* { dg-final { scan-not-hidden "g" } } */ +/* { dg-final { scan-not-hidden "h" } } */ +/* { dg-final { scan-not-hidden "k" } } */ +/* { dg-final { scan-not-hidden "l" } } */ + +__declspec(dllexport) void g() {} + +__declspec(dllexport) void h(); +void h() {} + +__declspec(dllexport) int k; + +__declspec(dllexport) extern int l; +int l; diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp index 7080df8267b..3f2d9aa701e 100644 --- a/gcc/testsuite/lib/gcc-dg.exp +++ b/gcc/testsuite/lib/gcc-dg.exp @@ -338,8 +338,10 @@ proc dg-require-profiling { args } { proc dg-require-dll { args } { global target_triplet - # As a special case, the mcore-*-elf supports dllimport/dllexport. - if { [string match "mcore-*-elf" $target_triplet] } { + # As a special case, the mcore-*-elf supports these attributes. + # All Symbian OS targets also support these attributes. + if { [string match "mcore-*-elf" $target_triplet] + || [string match "*-*-symbianelf" $target_triplet]} { return } # PE/COFF targets support dllimport/dllexport. diff --git a/gcc/testsuite/lib/scanasm.exp b/gcc/testsuite/lib/scanasm.exp index 79d93cbf089..9116afc1c41 100644 --- a/gcc/testsuite/lib/scanasm.exp +++ b/gcc/testsuite/lib/scanasm.exp @@ -79,6 +79,32 @@ proc scan-assembler-not { args } { dg-scan "scan-assembler-not" 0 $testcase $output_file $args } +# Check that a symbol is defined as a hidden symbol in the .s file +# produced by the compiler. + +proc scan-hidden { args } { + upvar 2 name testcase + set output_file "[file rootname [file tail $testcase]].s" + + set symbol [lindex $args 0] + set args [lreplace $args 0 0 "hidden\[ \t_\]*$symbol"] + + dg-scan "scan-hidden" 1 $testcase $output_file $args +} + +# Check that a symbol is not defined as a hidden symbol in the .s file +# produced by the compiler. + +proc scan-not-hidden { args } { + upvar 2 name testcase + set output_file "[file rootname [file tail $testcase]].s" + + set symbol [lindex $args 0] + set args [lreplace $args 0 0 "hidden\[ \t_\]*$symbol"] + + dg-scan "scan-not-hidden" 0 $testcase $output_file $args +} + # Look for a pattern in OUTPUT_FILE. See dg-scan for details. proc scan-file { output_file args } { |