/* { dg-do compile } */
/* { dg-options "-O2 -Wall -Wwrite-strings -Werror -fmerge-all-constants -fno-stack-protector -mieee -fdump-rtl-expand" } */

struct expression {
  unsigned long int num;
};
union YYSTYPE {
  unsigned long int num;
  struct expression *exp;
};

typedef union YYSTYPE YYSTYPE;

struct expression * new_exp_0 (int);

union yyalloc {
  short yyss_alloc;
};

static const signed char yypact[] = {
  -9, -9, -10, -10, -9, 8, 36, -10, 13, -10, -9, -9, -9, -9, -9, -9, -9, -10, 26, 41, 45, 18, -2, 14, -10, -9, 36 };
static const unsigned char yydefact[] = {
  0, 0, 12, 11, 0, 0, 2, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 4, 5, 6, 7, 8, 9, 0, 3 };

static const signed char yypgoto[3] = "\366\366\377";
static const signed char yydefgoto[3] = "\377\005\006";

static const unsigned char yytable[] = {
  7, 1, 2, 8, 3, 4, 15, 16, 9, 18, 19, 20, 21, 22, 23, 24, 10, 11, 12, 13, 14, 15, 16, 16, 26, 14, 15, 16, 17, 10, 11, 12, 13, 14, 15, 16, 0, 0, 25, 10, 11, 12, 13, 14, 15, 16, 12, 13, 14, 15, 16, 13, 14, 15, 16 };

static const signed char yycheck[] = {
  1, 10, 11, 4, 13, 14, 8, 9, 0, 10, 11, 12, 13, 14, 15, 16, 3, 4, 5, 6, 7, 8, 9, 9, 25, 7, 8, 9, 15, 3, 4, 5, 6, 7, 8, 9, -1, -1, 12, 3, 4, 5, 6, 7, 8, 9, 5, 6, 7, 8, 9, 6, 7, 8, 9 };

static const unsigned char yyr1[] = {
  0, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18 };

static const unsigned char yyr2[] = {
  0, 2, 1, 5, 3, 3, 3, 3, 3, 3, 2, 1, 1, 3 };

int __gettextparse (void)
{
  int yystate = 0;
  short yyssa[200];
  short *yyss = yyss;
  short *yyssp = yyssa;
  YYSTYPE yyvsa[200];
  YYSTYPE *yyvsp = yyvsa;
  enum { yystacksize = 200 };
  int yylen = 0;
  goto yysetstate;
 yynewstate: yyssp++;
 yysetstate: *yyssp = yystate;

  if (yyss + yystacksize - 1 <= yyssp)
    {
      long unsigned int yysize = yyssp - yyss + 1;
      {
	short *yyss1 = yyss;
	union yyalloc *yyptr = (union yyalloc *) __builtin_malloc ((yystacksize * (sizeof (short) + sizeof (YYSTYPE)) + (sizeof (union yyalloc) - 1)));
	if (!yyptr) return 0;
	__builtin_memcpy (&yyptr->yyss_alloc, yyss, yysize * sizeof *(yyss));
	yyss = &yyptr->yyss_alloc;
	if (yyss1 != yyssa) __builtin_free (yyss1);
      }
      if (yyss + yystacksize - 1 <= yyssp)
	return 0;
    }

  int yyn = yypact[yystate];
  if (yyn == -10)
    goto yydefault;

  yyn = yytable[yyn];
  if (yyn <= 0)
    goto yyreduce;

 yydefault: yyn = yydefact[yystate];
 yyreduce: yylen = yyr2[yyn];

  YYSTYPE yyval;
  if (yyn == 12 && (yyval.exp = new_exp_0 (0)) != 0)
    (yyval.exp)->num = (yyvsp[0].num);

  (yyvsp -= yylen, yyssp -= yylen);
  yyn = yyr1[yyn];
  yystate = yypgoto[yyn - 16] + *yyssp;
  if (0 <= yystate && yystate <= 54 && yycheck[yystate] == *yyssp)
    yystate = yytable[yystate];
  else
    yystate = yydefgoto[yyn - 16];

  goto yynewstate;
}

/* { dg-final { scan-rtl-dump-not "const_int 230584300921" "expand" } } */
/* { dg-final { scan-assembler-not "yypgoto\\+230584300921" } } */
