gas: require an operand to .startof.()/.sizeof.()
authorJan Beulich <jbeulich@novell.com>
Wed, 22 Feb 2017 09:37:52 +0000 (10:37 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 22 Feb 2017 09:37:52 +0000 (10:37 +0100)
gas/ChangeLog
gas/expr.c
gas/testsuite/gas/all/err-sizeof.s [new file with mode: 0644]

index 9f7ce60e85f870f580ae5cbe2a4abf3424281312..652bd047db99b223780d19c0f216c62232fd2b80 100644 (file)
@@ -1,3 +1,9 @@
+2017-02-21  Jan Beulich  <jbeulich@suse.com>
+
+       * expr.c (operand): Handle missing operand to .startof.() and
+       .sizeof.().
+       * testsuite/gas/all/err-sizeof.s: New.
+
 2017-02-20  Alan Modra  <amodra@gmail.com>
 
        PR 21118
index c6685add270228f2173d8f56530e481618d8b286..6fc707b8a593eea0441568cf46e6cf7c14d71932 100644 (file)
@@ -1154,6 +1154,10 @@ operand (expressionS *expressionP, enum expr_mode mode)
                   || input_line_pointer[1] == 'T');
          input_line_pointer += start ? 8 : 7;
          SKIP_WHITESPACE ();
+
+         /* Cover for the as_bad () invocations below.  */
+         expressionP->X_op = O_absent;
+
          if (*input_line_pointer != '(')
            as_bad (_("syntax error in .startof. or .sizeof."));
          else
@@ -1163,6 +1167,16 @@ operand (expressionS *expressionP, enum expr_mode mode)
              ++input_line_pointer;
              SKIP_WHITESPACE ();
              c = get_symbol_name (& name);
+             if (! *name)
+               {
+                 as_bad (_("expected symbol name"));
+                 (void) restore_line_pointer (c);
+                 if (c != ')')
+                   ignore_rest_of_line ();
+                 else
+                   ++input_line_pointer;
+                 break;
+               }
 
              buf = concat (start ? ".startof." : ".sizeof.", name,
                            (char *) NULL);
@@ -1306,6 +1320,14 @@ operand (expressionS *expressionP, enum expr_mode mode)
              SKIP_WHITESPACE_AFTER_NAME ();
 
              c = get_symbol_name (& name);
+             if (! *name)
+               {
+                 as_bad (_("expected symbol name"));
+                 expressionP->X_op = O_absent;
+                 (void) restore_line_pointer (c);
+                 ignore_rest_of_line ();
+                 break;
+               }
 
              buf = concat (start ? ".startof." : ".sizeof.", name,
                            (char *) NULL);
diff --git a/gas/testsuite/gas/all/err-sizeof.s b/gas/testsuite/gas/all/err-sizeof.s
new file mode 100644 (file)
index 0000000..4ddb5bd
--- /dev/null
@@ -0,0 +1,21 @@
+;# .sizeof. and .startof. operator diagnostics
+;# { dg-do assemble }
+       .long   .sizeof.(a b)           ;# { dg-error "Error: syntax error" }
+       .long   .startof.(x y)          ;# { dg-error "Error: syntax error" }
+       .long   .sizeof.(a+b)           ;# { dg-error "Error: syntax error" }
+       .long   .startof.(x-y)          ;# { dg-error "Error: syntax error" }
+       .long   .sizeof.("a+b")
+       .long   .startof.("x-y")
+       .long   .sizeof.()              ;# { dg-error "Error: expected symbol name" }
+       .long   .startof.()             ;# { dg-error "Error: expected symbol name" }
+;# We don't really care about these, but I didn't find a way to discard
+;# them, and I also don't want to use dg-excess-errors here.
+;# { dg-error "junk at end" "" { target *-*-* } 3 }
+;# { dg-error "junk at end" "junk" { target *-*-* } 4 }
+;# { dg-error "junk at end" "junk" { target *-*-* } 5 }
+;# { dg-error "UND" "undefined" { target *-*-* } 5 }
+;# { dg-error "junk at end" "junk" { target *-*-* } 6 }
+;# { dg-error "UND" "undefined" { target *-*-* } 6 }
+;# { dg-error "too complex" "too complex" { target powerpc*-*-* } 6 }
+;# { dg-warning "zero assumed" "missing" { target *-*-* } 9 }
+;# { dg-warning "zero assumed" "missing" { target *-*-* } 10 }