diff options
author | Richard Henderson <rth@gcc.gnu.org> | 2002-03-22 14:51:48 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-03-22 14:51:48 -0800 |
commit | 41c643948c237b94330e47ff9f860206ebb816c2 (patch) | |
tree | ef58fdf21cd2d5af8fcc1fdca3da41897a87502f /gcc/testsuite | |
parent | 661fff62a918df093c952e14a1656f0e151c137a (diff) | |
download | gcc-41c643948c237b94330e47ff9f860206ebb816c2.zip gcc-41c643948c237b94330e47ff9f860206ebb816c2.tar.gz gcc-41c643948c237b94330e47ff9f860206ebb816c2.tar.bz2 |
c-pragma.c (maybe_apply_renaming_pragma): New.
* c-pragma.c (maybe_apply_renaming_pragma): New.
(handle_pragma_redefine_extname, pending_redefine_extname): New.
(handle_pragma_extern_prefix, pragma_extern_prefix): New.
(init_pragma): Register them.
* c-pragma.h (maybe_apply_renaming_pragma): Declare.
* c-decl.c (finish_decl): Call it.
* cp/decl.c (cp_finish_decl): Likewise.
* doc/extend.texi: Document the new pragmas.
* config/alpha/osf.h (CPP_SUBTARGET_SPEC): Add __EXTERN_PREFIX.
(HANDLE_PRAGMA_EXTERN_PREFIX): New.
* config/i386/sol2.h (CPP_PREDEFINES): Add __PRAGMA_REDEFINE_EXTNAME.
(HANDLE_PRAGMA_REDEFINE_EXTNAME): New.
* config/sparc/sol2.h: Likewise.
* g++.dg/other/pragma-re-1.C: New.
* g++.dg/other/pragma-ep-1.C: New.
* gcc.dg/pragma-re-1.c, gcc.dg/pragma-re-2.c: New.
* gcc.dg/pragma-ep-1.c, gcc.dg/pragma-ep-2.c: New.
* gcc.dg/pragma-ep-3.c: New.
From-SVN: r51200
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/g++.dg/other/pragma-ep-1.C | 27 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/pragma-re-1.C | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pragma-ep-1.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pragma-ep-2.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pragma-ep-3.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pragma-re-1.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pragma-re-2.c | 6 |
7 files changed, 105 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/other/pragma-ep-1.C b/gcc/testsuite/g++.dg/other/pragma-ep-1.C new file mode 100644 index 0000000..99450cd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pragma-ep-1.C @@ -0,0 +1,27 @@ +/* { dg-do compile { target *-*-osf5* } } */ +/* { dg-final { scan-assembler "xyzzy_one" } } */ +/* { dg-final { scan-assembler "xyzzy_two" } } */ +/* { dg-final { scan-assembler "xyzzz_three" } } */ +/* { dg-final { scan-assembler "four" } } */ +/* { dg-final { scan-assembler-not "_four" } } */ + +#ifndef __EXTERN_PREFIX +#error +#endif + +#pragma extern_prefix "xyzzy_" + +extern "C" int one(void); +extern "C" int two(void); + +#pragma extern_prefix "xyzzz_" + +extern "C" int three(void); + +#pragma extern_prefix "" + +extern "C" int four(void); + +void *p[] = { + (void *) one, (void *) two, (void *) three, (void *) four +}; diff --git a/gcc/testsuite/g++.dg/other/pragma-re-1.C b/gcc/testsuite/g++.dg/other/pragma-re-1.C new file mode 100644 index 0000000..ec567f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pragma-re-1.C @@ -0,0 +1,17 @@ +/* { dg-do compile { target *-*-solaris* } } */ +/* { dg-final { scan-assembler "bar" } } */ +/* { dg-final { scan-assembler-not "foo" } } */ +/* { dg-final { scan-assembler "_Z3bazv" } } */ +/* { dg-final { scan-assembler-not "baq" } } */ + +#ifndef __PRAGMA_REDEFINE_EXTNAME +#error +#endif + +#pragma redefine_extname foo bar +extern "C" int foo(void); +void *p = (void *)foo; + +#pragma redefine_extname baz baq +extern int baz(void); +void *q = (void *)baz; diff --git a/gcc/testsuite/gcc.dg/pragma-ep-1.c b/gcc/testsuite/gcc.dg/pragma-ep-1.c new file mode 100644 index 0000000..91ec640 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pragma-ep-1.c @@ -0,0 +1,27 @@ +/* { dg-do compile { target *-*-osf5* } } */ +/* { dg-final { scan-assembler "xyzzy_one" } } */ +/* { dg-final { scan-assembler "xyzzy_two" } } */ +/* { dg-final { scan-assembler "xyzzz_three" } } */ +/* { dg-final { scan-assembler "four" } } */ +/* { dg-final { scan-assembler-not "_four" } } */ + +#ifndef __EXTERN_PREFIX +#error +#endif + +#pragma extern_prefix "xyzzy_" + +extern int one(void); +extern int two(void); + +#pragma extern_prefix "xyzzz_" + +extern int three(void); + +#pragma extern_prefix "" + +extern int four(void); + +int (*p[]) (void) = { + one, two, three, four +}; diff --git a/gcc/testsuite/gcc.dg/pragma-ep-2.c b/gcc/testsuite/gcc.dg/pragma-ep-2.c new file mode 100644 index 0000000..6e5c467 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pragma-ep-2.c @@ -0,0 +1,7 @@ +/* { dg-do compile { target *-*-osf5* } } */ + +#pragma extern_prefix /* { dg-warning "malformed" } */ +#pragma extern_prefix foo /* { dg-warning "malformed" } */ +#pragma extern_prefix "foo" 1 /* { dg-warning "junk" } */ + +int bar; /* silence `ISO C forbids an empty source file' warning */ diff --git a/gcc/testsuite/gcc.dg/pragma-ep-3.c b/gcc/testsuite/gcc.dg/pragma-ep-3.c new file mode 100644 index 0000000..95b38bc --- /dev/null +++ b/gcc/testsuite/gcc.dg/pragma-ep-3.c @@ -0,0 +1,10 @@ +/* { dg-do compile { target alpha*-*-osf5* } */ +/* { dg-final { scan-assembler ",Xfoo" } } */ + +#pragma extern_prefix "X" +void foo(void) __attribute__((noreturn)); +void foo(void) __attribute__((noreturn)); +void bar() +{ + foo(); +} diff --git a/gcc/testsuite/gcc.dg/pragma-re-1.c b/gcc/testsuite/gcc.dg/pragma-re-1.c new file mode 100644 index 0000000..80b1d37 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pragma-re-1.c @@ -0,0 +1,11 @@ +/* { dg-do compile { target *-*-solaris* } } */ +/* { dg-final { scan-assembler "bar" } } */ +/* { dg-final { scan-assembler-not "foo" } } */ + +#ifndef __PRAGMA_REDEFINE_EXTNAME +#error +#endif + +#pragma redefine_extname foo bar +extern int foo(void); +void *p = (void *)foo; diff --git a/gcc/testsuite/gcc.dg/pragma-re-2.c b/gcc/testsuite/gcc.dg/pragma-re-2.c new file mode 100644 index 0000000..351cbfb --- /dev/null +++ b/gcc/testsuite/gcc.dg/pragma-re-2.c @@ -0,0 +1,6 @@ +/* { dg-do compile { target *-*-solaris* } } */ + +#pragma redefine_extname /* { dg-warning "malformed" } */ +#pragma redefine_extname foo /* { dg-warning "malformed" } */ +#pragma redefine_extname foo 1 /* { dg-warning "malformed" } */ +#pragma redefine_extname foo bar 2 /* { dg-warning "junk" } */ |