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++/35158 +// { 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 147033) +++ gcc/cp/parser.c (working copy) @@ -10981,10 +10981,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. */ @@ -11075,10 +11077,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_at (token->location, "%qE is not allowed here", + token->u.value); + cp_lexer_consume_token (parser->lexer); + goto restart; + default: break; } /* Handle simple keywords. */