From: Jakub Jelinek Date: Tue, 23 Feb 2016 19:47:24 +0000 (+0100) Subject: re PR objc/69844 (Possibly bogus error: unknown type name in ObjC code) X-Git-Tag: basepoints/gcc-7~797 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=067fbd8b4b3a4af6d0948204e42b2f928c5e5282;p=thirdparty%2Fgcc.git re PR objc/69844 (Possibly bogus error: unknown type name in ObjC code) PR objc/69844 * c-parser.c (c_parser_for_statement): Properly handle ObjC classes in id_kind reclassification. * objc.dg/pr69844.m: New test. From-SVN: r233643 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index ae00338ec27a..d0fbaba96ba0 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2016-02-23 Jakub Jelinek + + PR objc/69844 + * c-parser.c (c_parser_for_statement): Properly handle ObjC classes + in id_kind reclassification. + 2016-02-16 Jakub Jelinek PR c/69835 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 23853be205fc..82c1d61b76af 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -5886,13 +5886,30 @@ c_parser_for_statement (c_parser *parser, bool ivdep) if (c_parser_next_token_is (parser, CPP_NAME)) { c_token *token = c_parser_peek_token (parser); - tree decl = lookup_name (token->value); - if (decl == NULL_TREE || VAR_P (decl)) - /* If DECL is null, we don't know what this token might be. Treat - it as an ID for better diagnostics; we'll error later on. */ - token->id_kind = C_ID_ID; - else if (TREE_CODE (decl) == TYPE_DECL) - token->id_kind = C_ID_TYPENAME; + + if (token->id_kind != C_ID_CLASSNAME) + { + tree decl = lookup_name (token->value); + + token->id_kind = C_ID_ID; + if (decl) + { + if (TREE_CODE (decl) == TYPE_DECL) + token->id_kind = C_ID_TYPENAME; + } + else if (c_dialect_objc ()) + { + tree objc_interface_decl = objc_is_class_name (token->value); + /* Objective-C class names are in the same namespace as + variables and typedefs, and hence are shadowed by local + declarations. */ + if (objc_interface_decl) + { + token->value = objc_interface_decl; + token->id_kind = C_ID_CLASSNAME; + } + } + } } token_indent_info next_tinfo diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4b8cb0193a0e..8a9e3a02f886 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-02-23 Jakub Jelinek + + PR objc/69844 + * objc.dg/pr69844.m: New test. + 2016-02-23 Jerry DeLisle PR libgfortran/69456 diff --git a/gcc/testsuite/objc.dg/pr69844.m b/gcc/testsuite/objc.dg/pr69844.m new file mode 100644 index 000000000000..9abcc7a360a7 --- /dev/null +++ b/gcc/testsuite/objc.dg/pr69844.m @@ -0,0 +1,24 @@ +/* PR objc/69844 */ +/* { dg-do compile } */ +/* { dg-options "-std=gnu99" } */ + +@class D; + +void +foo (void) +{ + for (;;) + ; + D *d = (id) 0; + (void) d; +} + +void +bar (void) +{ + for (int D = 0; D < 30; D++) + if (1) + ; + D *d = (id) 0; + (void) d; +}