Index: gcc/testsuite/g++.dg/gomp/pr36475.C =================================================================== --- gcc/testsuite/g++.dg/gomp/pr36475.C (revision 0) +++ gcc/testsuite/g++.dg/gomp/pr36475.C (revision 0) @@ -0,0 +1,9 @@ +// PR c++/36475 +// { dg-do compile } +// { dg-options "-fopenmp" } +int main() { +#pragma omp parallel for + for (register int i = 0; i < 2; ++i) { // { dg-error ".register. is not allowed" } + } + return 0; +} Index: gcc/cp/parser.c =================================================================== --- gcc/cp/parser.c (revision 141361) +++ gcc/cp/parser.c (working copy) @@ -3372,10 +3372,21 @@ cp_parser_primary_expression (cp_parser case RID_AT_ENCODE: case RID_AT_PROTOCOL: case RID_AT_SELECTOR: return cp_parser_objc_expression (parser); + case RID_REGISTER: + case RID_STATIC: + case RID_EXTERN: + case RID_MUTABLE: + if (!cp_parser_uncommitted_to_tentative_parse_p (parser)) + error ("%H%qE is not allowed here", + &token->location, token->u.value); + cp_parser_simulate_error (parser); + cp_lexer_consume_token (parser->lexer); + return error_mark_node; + default: cp_parser_error (parser, "expected primary-expression"); return error_mark_node; } @@ -10873,10 +10884,12 @@ cp_parser_type_specifier (cp_parser* par if (declares_class_or_enum) *declares_class_or_enum = 0; /* And that it does not specify a cv-qualifier. */ if (is_cv_qualifier) *is_cv_qualifier = false; + + restart: /* Peek at the next token. */ token = cp_lexer_peek_token (parser->lexer); /* If we're looking at a keyword, we can use that to guide the production we choose. */ @@ -10966,10 +10979,19 @@ cp_parser_type_specifier (cp_parser* par case RID_COMPLEX: /* The `__complex__' keyword is a GNU extension. */ ds = ds_complex; break; + case RID_REGISTER: + case RID_STATIC: + case RID_EXTERN: + case RID_MUTABLE: + error ("%H%qE is not allowed here", + &token->location, token->u.value); + cp_lexer_consume_token (parser->lexer); + goto restart; + default: break; } /* Handle simple keywords. */