matchexp.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. /* Expression parser.
  2. Copyright (C) 2000-2015 Free Software Foundation, Inc.
  3. Contributed by Andy Vaught
  4. This file is part of GCC.
  5. GCC is free software; you can redistribute it and/or modify it under
  6. the terms of the GNU General Public License as published by the Free
  7. Software Foundation; either version 3, or (at your option) any later
  8. version.
  9. GCC is distributed in the hope that it will be useful, but WITHOUT ANY
  10. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  12. for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with GCC; see the file COPYING3. If not see
  15. <http://www.gnu.org/licenses/>. */
  16. #include "config.h"
  17. #include "system.h"
  18. #include "coretypes.h"
  19. #include "gfortran.h"
  20. #include "arith.h"
  21. #include "match.h"
  22. static char expression_syntax[] = N_("Syntax error in expression at %C");
  23. /* Match a user-defined operator name. This is a normal name with a
  24. few restrictions. The error_flag controls whether an error is
  25. raised if 'true' or 'false' are used or not. */
  26. match
  27. gfc_match_defined_op_name (char *result, int error_flag)
  28. {
  29. static const char * const badops[] = {
  30. "and", "or", "not", "eqv", "neqv", "eq", "ne", "ge", "le", "lt", "gt",
  31. NULL
  32. };
  33. char name[GFC_MAX_SYMBOL_LEN + 1];
  34. locus old_loc;
  35. match m;
  36. int i;
  37. old_loc = gfc_current_locus;
  38. m = gfc_match (" . %n .", name);
  39. if (m != MATCH_YES)
  40. return m;
  41. /* .true. and .false. have interpretations as constants. Trying to
  42. use these as operators will fail at a later time. */
  43. if (strcmp (name, "true") == 0 || strcmp (name, "false") == 0)
  44. {
  45. if (error_flag)
  46. goto error;
  47. gfc_current_locus = old_loc;
  48. return MATCH_NO;
  49. }
  50. for (i = 0; badops[i]; i++)
  51. if (strcmp (badops[i], name) == 0)
  52. goto error;
  53. for (i = 0; name[i]; i++)
  54. if (!ISALPHA (name[i]))
  55. {
  56. gfc_error ("Bad character %<%c%> in OPERATOR name at %C", name[i]);
  57. return MATCH_ERROR;
  58. }
  59. strcpy (result, name);
  60. return MATCH_YES;
  61. error:
  62. gfc_error ("The name %qs cannot be used as a defined operator at %C",
  63. name);
  64. gfc_current_locus = old_loc;
  65. return MATCH_ERROR;
  66. }
  67. /* Match a user defined operator. The symbol found must be an
  68. operator already. */
  69. static match
  70. match_defined_operator (gfc_user_op **result)
  71. {
  72. char name[GFC_MAX_SYMBOL_LEN + 1];
  73. match m;
  74. m = gfc_match_defined_op_name (name, 0);
  75. if (m != MATCH_YES)
  76. return m;
  77. *result = gfc_get_uop (name);
  78. return MATCH_YES;
  79. }
  80. /* Check to see if the given operator is next on the input. If this
  81. is not the case, the parse pointer remains where it was. */
  82. static int
  83. next_operator (gfc_intrinsic_op t)
  84. {
  85. gfc_intrinsic_op u;
  86. locus old_loc;
  87. old_loc = gfc_current_locus;
  88. if (gfc_match_intrinsic_op (&u) == MATCH_YES && t == u)
  89. return 1;
  90. gfc_current_locus = old_loc;
  91. return 0;
  92. }
  93. /* Call the INTRINSIC_PARENTHESES function. This is both
  94. used explicitly, as below, or by resolve.c to generate
  95. temporaries. */
  96. gfc_expr *
  97. gfc_get_parentheses (gfc_expr *e)
  98. {
  99. gfc_expr *e2;
  100. e2 = gfc_get_operator_expr (&e->where, INTRINSIC_PARENTHESES, e, NULL);
  101. e2->ts = e->ts;
  102. e2->rank = e->rank;
  103. return e2;
  104. }
  105. /* Match a primary expression. */
  106. static match
  107. match_primary (gfc_expr **result)
  108. {
  109. match m;
  110. gfc_expr *e;
  111. m = gfc_match_literal_constant (result, 0);
  112. if (m != MATCH_NO)
  113. return m;
  114. m = gfc_match_array_constructor (result);
  115. if (m != MATCH_NO)
  116. return m;
  117. m = gfc_match_rvalue (result);
  118. if (m != MATCH_NO)
  119. return m;
  120. /* Match an expression in parentheses. */
  121. if (gfc_match_char ('(') != MATCH_YES)
  122. return MATCH_NO;
  123. m = gfc_match_expr (&e);
  124. if (m == MATCH_NO)
  125. goto syntax;
  126. if (m == MATCH_ERROR)
  127. return m;
  128. m = gfc_match_char (')');
  129. if (m == MATCH_NO)
  130. gfc_error ("Expected a right parenthesis in expression at %C");
  131. /* Now we have the expression inside the parentheses, build the
  132. expression pointing to it. By 7.1.7.2, any expression in
  133. parentheses shall be treated as a data entity. */
  134. *result = gfc_get_parentheses (e);
  135. if (m != MATCH_YES)
  136. {
  137. gfc_free_expr (*result);
  138. return MATCH_ERROR;
  139. }
  140. return MATCH_YES;
  141. syntax:
  142. gfc_error (expression_syntax);
  143. return MATCH_ERROR;
  144. }
  145. /* Match a level 1 expression. */
  146. static match
  147. match_level_1 (gfc_expr **result)
  148. {
  149. gfc_user_op *uop;
  150. gfc_expr *e, *f;
  151. locus where;
  152. match m;
  153. gfc_gobble_whitespace ();
  154. where = gfc_current_locus;
  155. uop = NULL;
  156. m = match_defined_operator (&uop);
  157. if (m == MATCH_ERROR)
  158. return m;
  159. m = match_primary (&e);
  160. if (m != MATCH_YES)
  161. return m;
  162. if (uop == NULL)
  163. *result = e;
  164. else
  165. {
  166. f = gfc_get_operator_expr (&where, INTRINSIC_USER, e, NULL);
  167. f->value.op.uop = uop;
  168. *result = f;
  169. }
  170. return MATCH_YES;
  171. }
  172. /* As a GNU extension we support an expanded level-2 expression syntax.
  173. Via this extension we support (arbitrary) nesting of unary plus and
  174. minus operations following unary and binary operators, such as **.
  175. The grammar of section 7.1.1.3 is effectively rewritten as:
  176. R704 mult-operand is level-1-expr [ power-op ext-mult-operand ]
  177. R704' ext-mult-operand is add-op ext-mult-operand
  178. or mult-operand
  179. R705 add-operand is add-operand mult-op ext-mult-operand
  180. or mult-operand
  181. R705' ext-add-operand is add-op ext-add-operand
  182. or add-operand
  183. R706 level-2-expr is [ level-2-expr ] add-op ext-add-operand
  184. or add-operand
  185. */
  186. static match match_ext_mult_operand (gfc_expr **result);
  187. static match match_ext_add_operand (gfc_expr **result);
  188. static int
  189. match_add_op (void)
  190. {
  191. if (next_operator (INTRINSIC_MINUS))
  192. return -1;
  193. if (next_operator (INTRINSIC_PLUS))
  194. return 1;
  195. return 0;
  196. }
  197. static match
  198. match_mult_operand (gfc_expr **result)
  199. {
  200. /* Workaround -Wmaybe-uninitialized false positive during
  201. profiledbootstrap by initializing them. */
  202. gfc_expr *e = NULL, *exp, *r;
  203. locus where;
  204. match m;
  205. m = match_level_1 (&e);
  206. if (m != MATCH_YES)
  207. return m;
  208. if (!next_operator (INTRINSIC_POWER))
  209. {
  210. *result = e;
  211. return MATCH_YES;
  212. }
  213. where = gfc_current_locus;
  214. m = match_ext_mult_operand (&exp);
  215. if (m == MATCH_NO)
  216. gfc_error ("Expected exponent in expression at %C");
  217. if (m != MATCH_YES)
  218. {
  219. gfc_free_expr (e);
  220. return MATCH_ERROR;
  221. }
  222. r = gfc_power (e, exp);
  223. if (r == NULL)
  224. {
  225. gfc_free_expr (e);
  226. gfc_free_expr (exp);
  227. return MATCH_ERROR;
  228. }
  229. r->where = where;
  230. *result = r;
  231. return MATCH_YES;
  232. }
  233. static match
  234. match_ext_mult_operand (gfc_expr **result)
  235. {
  236. gfc_expr *all, *e;
  237. locus where;
  238. match m;
  239. int i;
  240. where = gfc_current_locus;
  241. i = match_add_op ();
  242. if (i == 0)
  243. return match_mult_operand (result);
  244. if (gfc_notification_std (GFC_STD_GNU) == ERROR)
  245. {
  246. gfc_error ("Extension: Unary operator following "
  247. "arithmetic operator (use parentheses) at %C");
  248. return MATCH_ERROR;
  249. }
  250. else
  251. gfc_warning (0, "Extension: Unary operator following "
  252. "arithmetic operator (use parentheses) at %C");
  253. m = match_ext_mult_operand (&e);
  254. if (m != MATCH_YES)
  255. return m;
  256. if (i == -1)
  257. all = gfc_uminus (e);
  258. else
  259. all = gfc_uplus (e);
  260. if (all == NULL)
  261. {
  262. gfc_free_expr (e);
  263. return MATCH_ERROR;
  264. }
  265. all->where = where;
  266. *result = all;
  267. return MATCH_YES;
  268. }
  269. static match
  270. match_add_operand (gfc_expr **result)
  271. {
  272. gfc_expr *all, *e, *total;
  273. locus where, old_loc;
  274. match m;
  275. gfc_intrinsic_op i;
  276. m = match_mult_operand (&all);
  277. if (m != MATCH_YES)
  278. return m;
  279. for (;;)
  280. {
  281. /* Build up a string of products or quotients. */
  282. old_loc = gfc_current_locus;
  283. if (next_operator (INTRINSIC_TIMES))
  284. i = INTRINSIC_TIMES;
  285. else
  286. {
  287. if (next_operator (INTRINSIC_DIVIDE))
  288. i = INTRINSIC_DIVIDE;
  289. else
  290. break;
  291. }
  292. where = gfc_current_locus;
  293. m = match_ext_mult_operand (&e);
  294. if (m == MATCH_NO)
  295. {
  296. gfc_current_locus = old_loc;
  297. break;
  298. }
  299. if (m == MATCH_ERROR)
  300. {
  301. gfc_free_expr (all);
  302. return MATCH_ERROR;
  303. }
  304. if (i == INTRINSIC_TIMES)
  305. total = gfc_multiply (all, e);
  306. else
  307. total = gfc_divide (all, e);
  308. if (total == NULL)
  309. {
  310. gfc_free_expr (all);
  311. gfc_free_expr (e);
  312. return MATCH_ERROR;
  313. }
  314. all = total;
  315. all->where = where;
  316. }
  317. *result = all;
  318. return MATCH_YES;
  319. }
  320. static match
  321. match_ext_add_operand (gfc_expr **result)
  322. {
  323. gfc_expr *all, *e;
  324. locus where;
  325. match m;
  326. int i;
  327. where = gfc_current_locus;
  328. i = match_add_op ();
  329. if (i == 0)
  330. return match_add_operand (result);
  331. if (gfc_notification_std (GFC_STD_GNU) == ERROR)
  332. {
  333. gfc_error ("Extension: Unary operator following "
  334. "arithmetic operator (use parentheses) at %C");
  335. return MATCH_ERROR;
  336. }
  337. else
  338. gfc_warning (0, "Extension: Unary operator following "
  339. "arithmetic operator (use parentheses) at %C");
  340. m = match_ext_add_operand (&e);
  341. if (m != MATCH_YES)
  342. return m;
  343. if (i == -1)
  344. all = gfc_uminus (e);
  345. else
  346. all = gfc_uplus (e);
  347. if (all == NULL)
  348. {
  349. gfc_free_expr (e);
  350. return MATCH_ERROR;
  351. }
  352. all->where = where;
  353. *result = all;
  354. return MATCH_YES;
  355. }
  356. /* Match a level 2 expression. */
  357. static match
  358. match_level_2 (gfc_expr **result)
  359. {
  360. gfc_expr *all, *e, *total;
  361. locus where;
  362. match m;
  363. int i;
  364. where = gfc_current_locus;
  365. i = match_add_op ();
  366. if (i != 0)
  367. {
  368. m = match_ext_add_operand (&e);
  369. if (m == MATCH_NO)
  370. {
  371. gfc_error (expression_syntax);
  372. m = MATCH_ERROR;
  373. }
  374. }
  375. else
  376. m = match_add_operand (&e);
  377. if (m != MATCH_YES)
  378. return m;
  379. if (i == 0)
  380. all = e;
  381. else
  382. {
  383. if (i == -1)
  384. all = gfc_uminus (e);
  385. else
  386. all = gfc_uplus (e);
  387. if (all == NULL)
  388. {
  389. gfc_free_expr (e);
  390. return MATCH_ERROR;
  391. }
  392. }
  393. all->where = where;
  394. /* Append add-operands to the sum. */
  395. for (;;)
  396. {
  397. where = gfc_current_locus;
  398. i = match_add_op ();
  399. if (i == 0)
  400. break;
  401. m = match_ext_add_operand (&e);
  402. if (m == MATCH_NO)
  403. gfc_error (expression_syntax);
  404. if (m != MATCH_YES)
  405. {
  406. gfc_free_expr (all);
  407. return MATCH_ERROR;
  408. }
  409. if (i == -1)
  410. total = gfc_subtract (all, e);
  411. else
  412. total = gfc_add (all, e);
  413. if (total == NULL)
  414. {
  415. gfc_free_expr (all);
  416. gfc_free_expr (e);
  417. return MATCH_ERROR;
  418. }
  419. all = total;
  420. all->where = where;
  421. }
  422. *result = all;
  423. return MATCH_YES;
  424. }
  425. /* Match a level three expression. */
  426. static match
  427. match_level_3 (gfc_expr **result)
  428. {
  429. gfc_expr *all, *e, *total = NULL;
  430. locus where;
  431. match m;
  432. m = match_level_2 (&all);
  433. if (m != MATCH_YES)
  434. return m;
  435. for (;;)
  436. {
  437. if (!next_operator (INTRINSIC_CONCAT))
  438. break;
  439. where = gfc_current_locus;
  440. m = match_level_2 (&e);
  441. if (m == MATCH_NO)
  442. gfc_error (expression_syntax);
  443. if (m != MATCH_YES)
  444. {
  445. gfc_free_expr (all);
  446. return MATCH_ERROR;
  447. }
  448. total = gfc_concat (all, e);
  449. if (total == NULL)
  450. {
  451. gfc_free_expr (all);
  452. gfc_free_expr (e);
  453. return MATCH_ERROR;
  454. }
  455. all = total;
  456. all->where = where;
  457. }
  458. *result = all;
  459. return MATCH_YES;
  460. }
  461. /* Match a level 4 expression. */
  462. static match
  463. match_level_4 (gfc_expr **result)
  464. {
  465. gfc_expr *left, *right, *r;
  466. gfc_intrinsic_op i;
  467. locus old_loc;
  468. locus where;
  469. match m;
  470. m = match_level_3 (&left);
  471. if (m != MATCH_YES)
  472. return m;
  473. old_loc = gfc_current_locus;
  474. if (gfc_match_intrinsic_op (&i) != MATCH_YES)
  475. {
  476. *result = left;
  477. return MATCH_YES;
  478. }
  479. if (i != INTRINSIC_EQ && i != INTRINSIC_NE && i != INTRINSIC_GE
  480. && i != INTRINSIC_LE && i != INTRINSIC_LT && i != INTRINSIC_GT
  481. && i != INTRINSIC_EQ_OS && i != INTRINSIC_NE_OS && i != INTRINSIC_GE_OS
  482. && i != INTRINSIC_LE_OS && i != INTRINSIC_LT_OS && i != INTRINSIC_GT_OS)
  483. {
  484. gfc_current_locus = old_loc;
  485. *result = left;
  486. return MATCH_YES;
  487. }
  488. where = gfc_current_locus;
  489. m = match_level_3 (&right);
  490. if (m == MATCH_NO)
  491. gfc_error (expression_syntax);
  492. if (m != MATCH_YES)
  493. {
  494. gfc_free_expr (left);
  495. return MATCH_ERROR;
  496. }
  497. switch (i)
  498. {
  499. case INTRINSIC_EQ:
  500. case INTRINSIC_EQ_OS:
  501. r = gfc_eq (left, right, i);
  502. break;
  503. case INTRINSIC_NE:
  504. case INTRINSIC_NE_OS:
  505. r = gfc_ne (left, right, i);
  506. break;
  507. case INTRINSIC_LT:
  508. case INTRINSIC_LT_OS:
  509. r = gfc_lt (left, right, i);
  510. break;
  511. case INTRINSIC_LE:
  512. case INTRINSIC_LE_OS:
  513. r = gfc_le (left, right, i);
  514. break;
  515. case INTRINSIC_GT:
  516. case INTRINSIC_GT_OS:
  517. r = gfc_gt (left, right, i);
  518. break;
  519. case INTRINSIC_GE:
  520. case INTRINSIC_GE_OS:
  521. r = gfc_ge (left, right, i);
  522. break;
  523. default:
  524. gfc_internal_error ("match_level_4(): Bad operator");
  525. }
  526. if (r == NULL)
  527. {
  528. gfc_free_expr (left);
  529. gfc_free_expr (right);
  530. return MATCH_ERROR;
  531. }
  532. r->where = where;
  533. *result = r;
  534. return MATCH_YES;
  535. }
  536. static match
  537. match_and_operand (gfc_expr **result)
  538. {
  539. gfc_expr *e, *r;
  540. locus where;
  541. match m;
  542. int i;
  543. i = next_operator (INTRINSIC_NOT);
  544. where = gfc_current_locus;
  545. m = match_level_4 (&e);
  546. if (m != MATCH_YES)
  547. return m;
  548. r = e;
  549. if (i)
  550. {
  551. r = gfc_not (e);
  552. if (r == NULL)
  553. {
  554. gfc_free_expr (e);
  555. return MATCH_ERROR;
  556. }
  557. }
  558. r->where = where;
  559. *result = r;
  560. return MATCH_YES;
  561. }
  562. static match
  563. match_or_operand (gfc_expr **result)
  564. {
  565. gfc_expr *all, *e, *total;
  566. locus where;
  567. match m;
  568. m = match_and_operand (&all);
  569. if (m != MATCH_YES)
  570. return m;
  571. for (;;)
  572. {
  573. if (!next_operator (INTRINSIC_AND))
  574. break;
  575. where = gfc_current_locus;
  576. m = match_and_operand (&e);
  577. if (m == MATCH_NO)
  578. gfc_error (expression_syntax);
  579. if (m != MATCH_YES)
  580. {
  581. gfc_free_expr (all);
  582. return MATCH_ERROR;
  583. }
  584. total = gfc_and (all, e);
  585. if (total == NULL)
  586. {
  587. gfc_free_expr (all);
  588. gfc_free_expr (e);
  589. return MATCH_ERROR;
  590. }
  591. all = total;
  592. all->where = where;
  593. }
  594. *result = all;
  595. return MATCH_YES;
  596. }
  597. static match
  598. match_equiv_operand (gfc_expr **result)
  599. {
  600. gfc_expr *all, *e, *total;
  601. locus where;
  602. match m;
  603. m = match_or_operand (&all);
  604. if (m != MATCH_YES)
  605. return m;
  606. for (;;)
  607. {
  608. if (!next_operator (INTRINSIC_OR))
  609. break;
  610. where = gfc_current_locus;
  611. m = match_or_operand (&e);
  612. if (m == MATCH_NO)
  613. gfc_error (expression_syntax);
  614. if (m != MATCH_YES)
  615. {
  616. gfc_free_expr (all);
  617. return MATCH_ERROR;
  618. }
  619. total = gfc_or (all, e);
  620. if (total == NULL)
  621. {
  622. gfc_free_expr (all);
  623. gfc_free_expr (e);
  624. return MATCH_ERROR;
  625. }
  626. all = total;
  627. all->where = where;
  628. }
  629. *result = all;
  630. return MATCH_YES;
  631. }
  632. /* Match a level 5 expression. */
  633. static match
  634. match_level_5 (gfc_expr **result)
  635. {
  636. gfc_expr *all, *e, *total;
  637. locus where;
  638. match m;
  639. gfc_intrinsic_op i;
  640. m = match_equiv_operand (&all);
  641. if (m != MATCH_YES)
  642. return m;
  643. for (;;)
  644. {
  645. if (next_operator (INTRINSIC_EQV))
  646. i = INTRINSIC_EQV;
  647. else
  648. {
  649. if (next_operator (INTRINSIC_NEQV))
  650. i = INTRINSIC_NEQV;
  651. else
  652. break;
  653. }
  654. where = gfc_current_locus;
  655. m = match_equiv_operand (&e);
  656. if (m == MATCH_NO)
  657. gfc_error (expression_syntax);
  658. if (m != MATCH_YES)
  659. {
  660. gfc_free_expr (all);
  661. return MATCH_ERROR;
  662. }
  663. if (i == INTRINSIC_EQV)
  664. total = gfc_eqv (all, e);
  665. else
  666. total = gfc_neqv (all, e);
  667. if (total == NULL)
  668. {
  669. gfc_free_expr (all);
  670. gfc_free_expr (e);
  671. return MATCH_ERROR;
  672. }
  673. all = total;
  674. all->where = where;
  675. }
  676. *result = all;
  677. return MATCH_YES;
  678. }
  679. /* Match an expression. At this level, we are stringing together
  680. level 5 expressions separated by binary operators. */
  681. match
  682. gfc_match_expr (gfc_expr **result)
  683. {
  684. gfc_expr *all, *e;
  685. gfc_user_op *uop;
  686. locus where;
  687. match m;
  688. m = match_level_5 (&all);
  689. if (m != MATCH_YES)
  690. return m;
  691. for (;;)
  692. {
  693. uop = NULL;
  694. m = match_defined_operator (&uop);
  695. if (m == MATCH_NO)
  696. break;
  697. if (m == MATCH_ERROR)
  698. {
  699. gfc_free_expr (all);
  700. return MATCH_ERROR;
  701. }
  702. where = gfc_current_locus;
  703. m = match_level_5 (&e);
  704. if (m == MATCH_NO)
  705. gfc_error (expression_syntax);
  706. if (m != MATCH_YES)
  707. {
  708. gfc_free_expr (all);
  709. return MATCH_ERROR;
  710. }
  711. all = gfc_get_operator_expr (&where, INTRINSIC_USER, all, e);
  712. all->value.op.uop = uop;
  713. }
  714. *result = all;
  715. return MATCH_YES;
  716. }