On Wed, Nov 14, 2018 at 12:35:27PM +0100, Jakub Jelinek wrote: > > + > > + When we come here, we have already matched the !GCC$ builtin string. */ > > +match > > +gfc_match_gcc_builtin (void) > > +{ > > + char builtin[GFC_MAX_SYMBOL_LEN + 1]; > > + > > + if (gfc_match_name (builtin) != MATCH_YES) > > + return MATCH_ERROR; > > + > > + gfc_gobble_whitespace (); > > + if (gfc_match ("attributes") != MATCH_YES) > > + return MATCH_ERROR; > > + > > + gfc_gobble_whitespace (); > > + if (gfc_match ("omp_simd_notinbranch") != MATCH_YES) > > + return MATCH_ERROR; > > Why so many gfc_match calls? Can't you e.g. just do > if (gfc_match ("%n attributes simd", builtin) != MATCH_YES) > return MATCH_ERROR; > > int builtin_kind = 0; /* Or whatever, just want to show the parsing here. > */ > if (gfc_match ("(notinbranch)") == MATCH_YES) > builtin_kind = -1; > else if (gfc_match ("(inbranch)") == MATCH_YES) > builtin_kind = 1; > > The space in gfc_match indicates gfc_gobble_whitespace (), i.e. optionally > eating whitespace (note, in fixed form white space is optionally eaten > pretty much always). If you want a mandatory space, there is "% ". > So it depends in if in fixed form we want to support e.g. > !GCC$ BUI L TIN SINf ATTRI BUT ESSIMD(NOT IN BRANCH) > and in free form e.g. > !gcc$ builtin sinf attributessimd (notinbranch) > I wouldn't use omp_simd because in C/C++ the attribute is called simd.
One more thing, for fixed form spaces are insignificant generally, gfc_next_char has: do { c = gfc_next_char_literal (NONSTRING); } while (gfc_current_form == FORM_FIXED && gfc_is_whitespace (c)); so a gfc_name in fixed form needs to be separated by something different from whitespace I'd say. Because in !gcc$ builtin sinf attribute simd or !GCC$ BUILTINSINFATTRIBUTESIMD you'd get in both cases sinfattributesimd as the builtin's name and nothing afterwards (so gfc_match would fail). One possibility is if (gfc_match ("(%n) attributes simd", name) == MATCH_YES) where you'd require parens around the builtin's name. Or it could go last in the syntax, i.e. !gcc$ builtin attributes simd sinf !gcc$ builtin attributes simd (notinbranch) sinf But I think ()s are better. Jakub