From: Stan Shebs Date: Mon, 18 Jun 2001 16:48:37 +0000 (+0000) Subject: objc.dg: New directory. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b2af8e32ecb9a1bc5558f13e2da84439364f3611;p=gcc.git objc.dg: New directory. * objc.dg: New directory. * objc.dg/dg.exp: New file. * objc.dg/alias.m: New. * objc.dg/class-1.m: New. * objc.dg/class-2.m: New. * objc.dg/const-str-1.m: New. * objc.dg/const-str-2.m: New. * objc.dg/id-1.m: New. * objc.dg/method-1.m: New. * objc.dg/super-class-1.m: New. * lib/objc-dg.exp: New file. From-SVN: r43446 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8313c3e86ee..5befa531a38 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,17 @@ +2001-06-18 Stan Shebs + + * objc.dg: New directory. + * objc.dg/dg.exp: New file. + * objc.dg/alias.m: New. + * objc.dg/class-1.m: New. + * objc.dg/class-2.m: New. + * objc.dg/const-str-1.m: New. + * objc.dg/const-str-2.m: New. + * objc.dg/id-1.m: New. + * objc.dg/method-1.m: New. + * objc.dg/super-class-1.m: New. + * lib/objc-dg.exp: New file. + 2001-06-16 John David Anglin * g++.dg/mangle1.C: Modify regexp to test for `[: \t\n]' at end diff --git a/gcc/testsuite/lib/objc-dg.exp b/gcc/testsuite/lib/objc-dg.exp new file mode 100644 index 00000000000..aa4364ce22e --- /dev/null +++ b/gcc/testsuite/lib/objc-dg.exp @@ -0,0 +1,164 @@ +# Copyright (C) 1997, 1999, 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +load_lib dg.exp +load_lib file-format.exp +load_lib target-supports.exp +load_lib scanasm.exp + +# For prune_gcc_output. +load_lib gcc.exp + +if ![info exists TORTURE_OPTIONS] { + # It is theoretically beneficial to group all of the O2/O3 options together, + # as in many cases the compiler will generate identical executables for + # all of them--and the c-torture testsuite will skip testing identical + # executables multiple times. + # Also note that -finline-functions is explicitly included in one of the + # items below, even though -O3 is also specified, because some ports may + # choose to disable inlining functions by default, even when optimizing. + set TORTURE_OPTIONS [list \ + { -O0 } \ + { -O1 } \ + { -O2 } \ + { -O3 -fomit-frame-pointer } \ + { -O3 -fomit-frame-pointer -funroll-loops } \ + { -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions } \ + { -O3 -g } \ + { -Os } ] +} + + +# Split TORTURE_OPTIONS into two choices: one for testcases with loops and +# one for testcases without loops. + +set torture_with_loops $TORTURE_OPTIONS +set torture_without_loops "" +foreach option $TORTURE_OPTIONS { + if ![string match "*loop*" $option] { + lappend torture_without_loops $option + } +} + +# Define gcc callbacks for dg.exp. + +proc objc-dg-test { prog do_what extra_tool_flags } { + # Set up the compiler flags, based on what we're going to do. + + switch $do_what { + "preprocess" { + set compile_type "preprocess" + set output_file "[file rootname [file tail $prog]].i" + } + "compile" { + set compile_type "assembly" + set output_file "[file rootname [file tail $prog]].s" + } + "assemble" { + set compile_type "object" + set output_file "[file rootname [file tail $prog]].o" + } + "link" { + set compile_type "executable" + set output_file "a.out" + # The following line is needed for targets like the i960 where + # the default output file is b.out. Sigh. + } + "run" { + set compile_type "executable" + # FIXME: "./" is to cope with "." not being in $PATH. + # Should this be handled elsewhere? + # YES. + set output_file "./a.out" + # This is the only place where we care if an executable was + # created or not. If it was, dg.exp will try to run it. + remote_file build delete $output_file; + } + default { + perror "$do_what: not a valid dg-do keyword" + return "" + } + } + set options "" + if { $extra_tool_flags != "" } { + lappend options "additional_flags=$extra_tool_flags" + } + + set comp_output [objc_target_compile "$prog" "$output_file" "$compile_type" $options]; + + return [list $comp_output $output_file] +} + +proc objc-dg-prune { system text } { + set text [prune_gcc_output $text] + + # If we see "region xxx is full" then the testcase is too big for ram. + # This is tricky to deal with in a large testsuite like c-torture so + # deal with it here. Just mark the testcase as unsupported. + if [regexp "(^|\n)\[^\n\]*: region \[^\n\]* is full" $text] { + # The format here is important. See dg.exp. + return "::unsupported::memory full" + } + + return $text +} + +# Utility routines. + +# +# search_for -- looks for a string match in a file +# +proc search_for { file pattern } { + set fd [open $file r] + while { [gets $fd cur_line]>=0 } { + if [string match "*$pattern*" $cur_line] then { + close $fd + return 1 + } + } + close $fd + return 0 +} + +# Modified dg-runtest that can cycle through a list of optimization options +# as c-torture does. +proc objc-dg-runtest { testcases default-extra-flags } { + global runtests + + foreach test $testcases { + # If we're only testing specific files and this isn't one of + # them, skip it. + if ![runtest_file_p $runtests $test] { + continue + } + + # Look for a loop within the source code - if we don't find one, + # don't pass -funroll[-all]-loops. + global torture_with_loops torture_without_loops + if [expr [search_for $test "for*("]+[search_for $test "while*("]] { + set option_list $torture_with_loops + } else { + set option_list $torture_without_loops + } + + set nshort [file tail [file dirname $test]]/[file tail $test] + + foreach flags $option_list { + verbose "Testing $nshort, $flags" 1 + dg-test $test $flags ${default-extra-flags} + } + } +} diff --git a/gcc/testsuite/objc.dg/alias.m b/gcc/testsuite/objc.dg/alias.m new file mode 100644 index 00000000000..bf6d12d4e4d --- /dev/null +++ b/gcc/testsuite/objc.dg/alias.m @@ -0,0 +1,12 @@ +/* Test alias warnings. */ +/* { dg-do compile } */ + +@compatibility_alias class1 class2; /* { dg-warning "Cannot find class" } */ + +@interface class3; +@end + +@interface class4; +@end + +@compatibility_alias class4 class3; /* { dg-warning "Class" "already exists" } */ diff --git a/gcc/testsuite/objc.dg/class-1.m b/gcc/testsuite/objc.dg/class-1.m new file mode 100644 index 00000000000..a7760e10484 --- /dev/null +++ b/gcc/testsuite/objc.dg/class-1.m @@ -0,0 +1,20 @@ +/* Redeclarations of class names. */ +/* { dg-do compile } */ + +typedef int foo; + +@class foo; /* { dg-error "redeclared as different kind of symbol" } */ +/* { dg-error "previous declaration of" "" { target *-*-* } 4 } */ + +typedef int bar; + +@interface bar +@end /* { dg-error "redeclared as different kind of symbol" } */ +/* { dg-error "previous declaration of" "" { target *-*-* } 9 } */ + +int glob; + +@implementation glob +@end /* { dg-error "redeclared as different kind of symbol" } */ +/* { dg-error "previous declaration of" "" { target *-*-* } 15 } */ +/* { dg-warning "Cannot find interface declaration" "" { target *-*-* } 18 } */ diff --git a/gcc/testsuite/objc.dg/class-2.m b/gcc/testsuite/objc.dg/class-2.m new file mode 100644 index 00000000000..a4514f9290a --- /dev/null +++ b/gcc/testsuite/objc.dg/class-2.m @@ -0,0 +1,15 @@ +/* Test super classes. */ +/* { dg-do compile } */ + +@interface supclass1 +@end + +@interface supclass2 +@end + +@interface class1 : supclass1 +@end + +@implementation class1 : supclass2 +@end /* { dg-error "conflicting super class name" } */ +/* { dg-error "previous declaration" "" { target *-*-* } 14 } */ diff --git a/gcc/testsuite/objc.dg/const-str-1.m b/gcc/testsuite/objc.dg/const-str-1.m new file mode 100644 index 00000000000..1d94faa1757 --- /dev/null +++ b/gcc/testsuite/objc.dg/const-str-1.m @@ -0,0 +1,16 @@ +/* Test errors for constant strings. */ +/* { dg-do compile } */ +/* { dg-options "-fgnu-runtime" } */ + +int foo() +{ + baz(@"hiya"); /* { dg-error "Cannot find interface declaration" } */ +} + +@interface NXConstantString +@end + +int bar() +{ + baz(@"howdah"); +} diff --git a/gcc/testsuite/objc.dg/const-str-2.m b/gcc/testsuite/objc.dg/const-str-2.m new file mode 100644 index 00000000000..42dccd91888 --- /dev/null +++ b/gcc/testsuite/objc.dg/const-str-2.m @@ -0,0 +1,10 @@ +/* Test the -fconstant-string-class flag error. */ +/* { dg-do compile } */ +/* { dg-options "-fconstant-string-class" } */ + +{ dg-error "no class name specified as argument to -fconstant-string-class" "" { target *-*-* } 0 } + +int foo () {} + +/* Seem bogus, should investigate some day. */ +/* { dg-error "parse error" "" { target *-*-* } 5 } */ diff --git a/gcc/testsuite/objc.dg/dg.exp b/gcc/testsuite/objc.dg/dg.exp new file mode 100644 index 00000000000..ebf952967c7 --- /dev/null +++ b/gcc/testsuite/objc.dg/dg.exp @@ -0,0 +1,35 @@ +# GCC Objective-C testsuite that uses the `dg.exp' driver. +# Copyright (C) 1997, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Load support procs. +load_lib objc-dg.exp + +# If a testcase doesn't have special options, use these. +global DEFAULT_CFLAGS +if ![info exists DEFAULT_CFLAGS] then { + set DEFAULT_CFLAGS "" +} + +# Initialize `dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[m\]]] \ + "" $DEFAULT_CFLAGS + +# All done. +dg-finish diff --git a/gcc/testsuite/objc.dg/id-1.m b/gcc/testsuite/objc.dg/id-1.m new file mode 100644 index 00000000000..026a6d4b8ae --- /dev/null +++ b/gcc/testsuite/objc.dg/id-1.m @@ -0,0 +1,6 @@ +/* Test the id type warning. */ +/* { dg-do compile } */ + +typedef int id; + +id b; /* { dg-warning "Unexpected type for `id'" } */ diff --git a/gcc/testsuite/objc.dg/method-1.m b/gcc/testsuite/objc.dg/method-1.m new file mode 100644 index 00000000000..acc03c68359 --- /dev/null +++ b/gcc/testsuite/objc.dg/method-1.m @@ -0,0 +1,34 @@ +/* Tests of duplication. */ +/* { dg-do compile } */ + +@interface class1 +- (int) meth1; +- (void) meth1; /* { dg-error "duplicate declaration of instance method" } */ +@end + +@interface class2 ++ (void) meth1; ++ (int) meth1; /* { dg-error "duplicate declaration of class method" } */ +@end + +@interface class3 +- (int) meth1; +@end + +@implementation class3 +- (int) meth1 {} +- (int) meth1 {} /* { dg-error "duplicate definition of instance method" } */ +/* { dg-error "redefinition of" "" { target *-*-* } 20 } */ +/* { dg-error "previously defined here" "" { target *-*-* } 19 } */ +@end + +@interface class4 ++ (void) meth1; +@end + +@implementation class4 ++ (void) meth1 {} ++ (void) meth1 {} /* { dg-error "duplicate definition of class method" } */ +/* { dg-error "redefinition of" "" { target *-*-* } 31 } */ +/* { dg-error "previously defined here" "" { target *-*-* } 30 } */ +@end diff --git a/gcc/testsuite/objc.dg/super-class-1.m b/gcc/testsuite/objc.dg/super-class-1.m new file mode 100644 index 00000000000..d4252c97eba --- /dev/null +++ b/gcc/testsuite/objc.dg/super-class-1.m @@ -0,0 +1,5 @@ +/* Test super classes. */ +/* { dg-do compile } */ + +@interface class0 : supclass0 +@end /* { dg-error "Cannot find interface declaration for .*, superclass" } */