Check that asm specs are handled correctly in structure and class field declarations.
authorbowdidge <bowdidge@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Oct 2003 23:45:26 +0000 (23:45 +0000)
committerbowdidge <bowdidge@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Oct 2003 23:45:26 +0000 (23:45 +0000)
Correct behavior is that these are permitted on static fields (because only one
instance exists) and are not permitted on non-static fields.  In the case of
static fields, check to make sure the assembler output shows the aliased name
somewhere.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72777 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/g++.dg/ext/asmspecInvalid.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/asmspecValid.C [new file with mode: 0644]

diff --git a/gcc/testsuite/g++.dg/ext/asmspecInvalid.C b/gcc/testsuite/g++.dg/ext/asmspecInvalid.C
new file mode 100644 (file)
index 0000000..4c528a0
--- /dev/null
@@ -0,0 +1,18 @@
+// tests that the asm directive is correctly handled for static fields
+// in structures and classes.  This only applies to C++; such
+// directives generate errors in C.  Assembler directives for local
+// variables should be tested by the C test suite.  
+//
+// Contributed by Robert Bowdidge (bowdidge@apple.com) 14 Oct 2003
+
+// { dg-do compile }
+
+struct Foo {
+  // This should reference a variable called bar
+  int i __asm__("bar");  /* { dg-error "specifiers are not permitted" } */
+};
+
+int main (void ) {
+  int j = 0;
+  return j;
+}
diff --git a/gcc/testsuite/g++.dg/ext/asmspecValid.C b/gcc/testsuite/g++.dg/ext/asmspecValid.C
new file mode 100644 (file)
index 0000000..98d98b4
--- /dev/null
@@ -0,0 +1,43 @@
+// tests that the asm directive is correctly handled for static fields
+// in structures and classes.  This only applies to C++; such
+// directives generate errors in C.  Assembler directives for local
+// variables should be tested by the C test suite.  
+//
+// Contributed by Robert Bowdidge (bowdidge@apple.com) 14 Oct 2003
+
+// { dg-do compile }
+
+struct Foo {
+  // This should reference a variable called bar
+  static int i __asm__("bar"); 
+};
+
+
+class Bar {
+public:
+  static int i __asm__("theRealI");
+  static int j __asm__("theRealJ");
+  int boof;
+};
+
+class Baz : public Bar { 
+public:
+   static char *ptr __asm__ ("theRealString");
+};
+
+int main (int argc, char **argv) {
+  struct Foo myFoo;
+  Bar b;
+  myFoo.i = 1;
+  Foo::i = 2;
+  Baz::j = 10;
+  Baz::ptr = 0;
+  b.i = 1;
+  return (b.i);
+}
+
+
+/* { dg-final {scan-assembler "bar"} } */
+/* { dg-final {scan-assembler "theRealString"} } */
+/* { dg-final {scan-assembler "theRealI" } } */
+/* { dg-final {scan-assembler "theRealJ" } } */