From: Jakub Jelinek Date: Wed, 1 Apr 2009 13:32:22 +0000 (+0200) Subject: re PR c/37772 (ICE with empty asm statement) X-Git-Tag: releases/gcc-4.5.0~6966 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b85eb797e2ffda39def175285b334b721c0b2b4f;p=thirdparty%2Fgcc.git re PR c/37772 (ICE with empty asm statement) PR c/37772 * c-parser.c (c_parser_asm_statement): Skip until close paren and return if c_parser_asm_string_literal returned NULL. * gcc.dg/pr37772.c: New test. * g++.dg/ext/asm11.C: New test. From-SVN: r145401 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 327d33d2c82f..54cad4cddc0e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-04-01 Jakub Jelinek + + PR c/37772 + * c-parser.c (c_parser_asm_statement): Skip until close paren and + return if c_parser_asm_string_literal returned NULL. + 2009-04-01 Nick Clifton * config/m32c/m32c.h (LIBGCC2_UNITS_PER_WORD): Define if not diff --git a/gcc/c-parser.c b/gcc/c-parser.c index 03a7194a8647..1be2ae5a5bc9 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -4193,6 +4193,12 @@ c_parser_asm_statement (c_parser *parser) return NULL_TREE; } str = c_parser_asm_string_literal (parser); + if (str == NULL_TREE) + { + parser->lex_untranslated_string = false; + c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, NULL); + return NULL_TREE; + } if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) { simple = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ee6dbb5a8a25..5aef381d4573 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,14 @@ +2009-04-01 Jakub Jelinek + + PR c/37772 + * gcc.dg/pr37772.c: New test. + * g++.dg/ext/asm11.C: New test. + 2009-04-01 H.J. Lu - (restore_ld_library_path_env_vars): Always restore GCC_EXEC_PREFIX - to its original value, or unset if it was not defined. + * lib/target-libpath.exp (restore_ld_library_path_env_vars): Always + restore GCC_EXEC_PREFIX to its original value, or unset if it was not + defined. 2009-03-31 Jason Merrill diff --git a/gcc/testsuite/g++.dg/ext/asm11.C b/gcc/testsuite/g++.dg/ext/asm11.C new file mode 100644 index 000000000000..7939aacc0f42 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm11.C @@ -0,0 +1,20 @@ +// PR c/37772 +// { dg-do compile } +// { dg-options "" } + +void +foo () +{ + int i; + asm (); // { dg-error "expected string-literal before" } + asm (1); // { dg-error "expected string-literal before" } + asm (int); // { dg-error "expected string-literal before" } + asm (: "=r" (i)); // { dg-error "expected string-literal before" } + asm (1 : "=r" (i)); // { dg-error "expected string-literal before" } + asm (int : "=r" (i)); // { dg-error "expected string-literal before" } + asm (: : "r" (i)); // { dg-error "expected string-literal before" } + asm (1 : : "r" (i)); // { dg-error "expected string-literal before" } + asm (int : : "r" (i)); // { dg-error "expected string-literal before" } + asm (: : : "memory"); // { dg-error "expected string-literal before" } + asm (1 : : : "memory"); // { dg-error "expected string-literal before" } +} diff --git a/gcc/testsuite/gcc.dg/pr37772.c b/gcc/testsuite/gcc.dg/pr37772.c new file mode 100644 index 000000000000..26051c7e834f --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr37772.c @@ -0,0 +1,20 @@ +/* PR c/37772 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void +foo () +{ + int i; + asm (); /* { dg-error "expected string literal before" } */ + asm (1); /* { dg-error "expected string literal before" } */ + asm (int); /* { dg-error "expected string literal before" } */ + asm (: "=r" (i)); /* { dg-error "expected string literal before" } */ + asm (1 : "=r" (i)); /* { dg-error "expected string literal before" } */ + asm (int : "=r" (i)); /* { dg-error "expected string literal before" } */ + asm (: : "r" (i)); /* { dg-error "expected string literal before" } */ + asm (1 : : "r" (i)); /* { dg-error "expected string literal before" } */ + asm (int : : "r" (i)); /* { dg-error "expected string literal before" } */ + asm (: : : "memory"); /* { dg-error "expected string literal before" } */ + asm (1 : : : "memory"); /* { dg-error "expected string literal before" } */ +}