https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109426

            Bug ID: 109426
           Summary: Gcc runs into Infinite loop, when resolving templates
           Product: gcc
           Version: 12.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: zhonghao at pku dot org.cn
  Target Milestone: ---

The code is as follows:

typedef struct astruct_d
{
 void *data;
} astruct;

/* Generate a whole bunch of unique fake mallocs, this
 keeps the vartrack dump simpler to understand (all
 the "size" arguments have a unique name). */
#define DE0(X) \
 void *malloc##X (unsigned long size##X);
#define DE1(X) \
 DE0(X##0) DE0(X##1) DE0(X##2) DE0(X##3) DE0(X##4) \
 DE0(X##5) DE0(X##6) DE0(X##7) DE0(X##8) DE0(X##9)
#define DE2(X) \
 DE1(X##0) DE1(X##1) DE1(X##2) DE1(X##3) DE1(X##4) \
 DE1(X##5) DE1(X##6) DE1(X##7) DE1(X##8) DE1(X##9)
#define DE3(X) \
 DE2(X##0) DE2(X##1) DE2(X##2) DE2(X##3) DE2(X##4) \
 DE2(X##5) DE2(X##6) DE2(X##7) DE2(X##8) DE2(X##9)
#define DE4(X) \
 DE3(X##0) DE3(X##1) DE3(X##2) DE3(X##3) DE3(X##4) \
 DE3(X##5) DE3(X##6) DE3(X##7) DE3(X##8) DE3(X##9)
DE4(0)
#undef DE0
#undef DE1
#undef DE2
#undef DE3
#undef DE4

void foo (void)
{
/* Now call all those mallocs and generate a series of
 variables while at it. */
#define DE0(X) \
 astruct *A##X = (astruct *) malloc##X(sizeof (astruct));
#define DE1(X) \
 DE0(X##0) DE0(X##1) DE0(X##2) DE0(X##3) DE0(X##4) \
 DE0(X##5) DE0(X##6) DE0(X##7) DE0(X##8) DE0(X##9)
#define DE2(X) \
 DE1(X##0) DE1(X##1) DE1(X##2) DE1(X##3) DE1(X##4) \
 DE1(X##5) DE1(X##6) DE1(X##7) DE1(X##8) DE1(X##9)
#define DE3(X) \
 DE2(X##0) DE2(X##1) DE2(X##2) DE2(X##3) DE2(X##4) \
 DE2(X##5) DE2(X##6) DE2(X##7) DE2(X##8) DE2(X##9)
#define DE4(X) \
 DE3(X##0) DE3(X##1) DE3(X##2) DE3(X##3) DE3(X##4) \
 DE3(X##5) DE3(X##6) DE3(X##7) DE3(X##8) DE3(X##9)
DE4(0)
DE4(1)
}

GCC runs into an infinite loop:

code0.c:35:18: warning: cast to pointer from integer of different size
[-Wint-to-pointer-cast]
   35 |  astruct *A##X = (astruct *) malloc##X(sizeof (astruct));
      |                  ^
code0.c:37:32: note: in expansion of macro ‘DE0’
   37 |  DE0(X##0) DE0(X##1) DE0(X##2) DE0(X##3) DE0(X##4) \
      |                                ^~~
code0.c:41:42: note: in expansion of macro ‘DE1’
   41 |  DE1(X##5) DE1(X##6) DE1(X##7) DE1(X##8) DE1(X##9)
      |                                          ^~~
code0.c:44:2: note: in expansion of macro ‘DE2’
   44 |  DE2(X##5) DE2(X##6) DE2(X##7) DE2(X##8) DE2(X##9)
      |  ^~~
code0.c:46:22: note: in expansion of macro ‘DE3’
   46 |  DE3(X##0) DE3(X##1) DE3(X##2) DE3(X##3) DE3(X##4) \
      |                      ^~~
code0.c:49:1: note: in expansion of macro ‘DE4’
   49 | DE4(1)
      | ^~~

Reply via email to