drmortalwombat / oscar64

Optimizing Small memory C Compiler Assembler and Runtime for C64
GNU General Public License v3.0
273 stars 24 forks source link

Struct member identifier not found #102

Closed AGPX closed 1 month ago

AGPX commented 1 month ago

In the following code the compiler doesn't recognize the field a inside the struct a:

#include "common.h"
struct a {
    char a, b;
    short c;
};

int
a1()
{
    static struct a x = { 1, 2, ~1 }, y = { 65, 2, ~2 };

    return (x.a == (y.a & ~64) && x.b == y.b);
}

int
a2()
{
    static struct a x = { 1, 66, ~1 }, y = { 1, 2, ~2 };

    return (x.a == y.a && (x.b & ~64) == y.b);
}

int
a3()
{
    static struct a x = { 9, 66, ~1 }, y = { 33, 18, ~2 };

    return ((x.a & ~8) == (y.a & ~32) && (x.b & ~64) == (y.b & ~16));
}

struct b {
    int c;
    short b, a;
};

int
b1()
{
    static struct b x = { ~1, 2, 1 }, y = { ~2, 2, 65 };

    return (x.a == (y.a & ~64) && x.b == y.b);
}

int
b2()
{
    static struct b x = { ~1, 66, 1 }, y = { ~2, 2, 1 };

    return (x.a == y.a && (x.b & ~64) == y.b);
}

int
b3()
{
    static struct b x = { ~1, 66, 9 }, y = { ~2, 18, 33 };

    return ((x.a & ~8) == (y.a & ~32) && (x.b & ~64) == (y.b & ~16));
}

struct c {
    unsigned int c:4, b:14, a:14;
} __attribute__ ((aligned));

int
c1()
{
    static struct c x = { ~1, 2, 1 }, y = { ~2, 2, 65 };

    return (x.a == (y.a & ~64) && x.b == y.b);
}

int
c2()
{
    static struct c x = { ~1, 66, 1 }, y = { ~2, 2, 1 };

    return (x.a == y.a && (x.b & ~64) == y.b);
}

int
c3()
{
    static struct c x = { ~1, 66, 9 }, y = { ~2, 18, 33 };

    return ((x.a & ~8) == (y.a & ~32) && (x.b & ~64) == (y.b & ~16));
}

struct d {
    unsigned int a:14, b:14, c:4;
} __attribute__ ((aligned));

int
d1()
{
    static struct d x = { 1, 2, ~1 }, y = { 65, 2, ~2 };

    return (x.a == (y.a & ~64) && x.b == y.b);
}

int
d2()
{
    static struct d x = { 1, 66, ~1 }, y = { 1, 2, ~2 };

    return (x.a == y.a && (x.b & ~64) == y.b);
}

int
d3()
{
    static struct d x = { 9, 66, ~1 }, y = { 33, 18, ~2 };

    return ((x.a & ~8) == (y.a & ~32) && (x.b & ~64) == (y.b & ~16));
}

struct e {
    int c:4, b:14, a:14;
} __attribute__ ((aligned));

int
e1()
{
    static struct e x = { ~1, -2, -65 }, y = { ~2, -2, -1 };

    return (x.a == (y.a & ~64) && x.b == y.b);
}

int
e2()
{
    static struct e x = { ~1, -2, -1 }, y = { ~2, -66, -1 };

    return (x.a == y.a && (x.b & ~64) == y.b);
}

int
e3()
{
    static struct e x = { ~1, -18, -33 }, y = { ~2, -66, -9 };

    return ((x.a & ~8) == (y.a & ~32) && (x.b & ~64) == (y.b & ~16));
}

int
e4()
{
    static struct e x = { -1, -1, 0 };

    return x.a == 0 && x.b & 0x2000;
}

struct f {
    int a:14, b:14, c:4;
} __attribute__ ((aligned));

int
f1()
{
    static struct f x = { -65, -2, ~1 }, y = { -1, -2, ~2 };

    return (x.a == (y.a & ~64) && x.b == y.b);
}

int
f2()
{
    static struct f x = { -1, -2, ~1 }, y = { -1, -66, ~2 };

    return (x.a == y.a && (x.b & ~64) == y.b);
}

int
f3()
{
    static struct f x = { -33, -18, ~1 }, y = { -9, -66, ~2 };

    return ((x.a & ~8) == (y.a & ~32) && (x.b & ~64) == (y.b & ~16));
}

int
f4()
{
    static struct f x = { 0, -1, -1 };

    return x.a == 0 && x.b & 0x2000;
}

struct gx {
    int c:4, b:14, a:14;
} __attribute__ ((aligned));
struct gy {
    int b:14, a:14, c:4;
} __attribute__ ((aligned));

int
g1()
{
    static struct gx x = { ~1, -2, -65 };
    static struct gy y = { -2, -1, ~2 };

    return (x.a == (y.a & ~64) && x.b == y.b);
}

int
g2()
{
    static struct gx x = { ~1, -2, -1 };
    static struct gy y = { -66, -1, ~2 };

    return (x.a == y.a && (x.b & ~64) == y.b);
}

int
g3()
{
    static struct gx x = { ~1, -18, -33 };
    static struct gy y = { -66, -9, ~2 };

    return ((x.a & ~8) == (y.a & ~32) && (x.b & ~64) == (y.b & ~16));
}

int
g4()
{
    static struct gx x = { ~1, 0x0020, 0x0010 };
    static struct gy y = { 0x0200, 0x0100, ~2 };

    return ((x.a & 0x00f0) == (y.a & 0x0f00) &&
        (x.b & 0x00f0) == (y.b & 0x0f00));
}

int
g5()
{
    static struct gx x = { ~1, 0x0200, 0x0100 };
    static struct gy y = { 0x0020, 0x0010, ~2 };

    return ((x.a & 0x0f00) == (y.a & 0x00f0) &&
        (x.b & 0x0f00) == (y.b & 0x00f0));
}

int
g6()
{
    static struct gx x = { ~1, 0xfe20, 0xfd10 };
    static struct gy y = { 0xc22f, 0xc11f, ~2 };

    return ((x.a & 0x03ff) == (y.a & 0x3ff0) &&
        (x.b & 0x03ff) == (y.b & 0x3ff0));
}

int
g7()
{
    static struct gx x = { ~1, 0xc22f, 0xc11f };
    static struct gy y = { 0xfe20, 0xfd10, ~2 };

    return ((x.a & 0x3ff0) == (y.a & 0x03ff) &&
        (x.b & 0x3ff0) == (y.b & 0x03ff));
}

struct hx {
    int a:14, b:14, c:4;
} __attribute__ ((aligned));
struct hy {
    int c:4, a:14, b:14;
} __attribute__ ((aligned));

int
h1()
{
    static struct hx x = { -65, -2, ~1 };
    static struct hy y = { ~2, -1, -2 };

    return (x.a == (y.a & ~64) && x.b == y.b);
}

int
h2()
{
    static struct hx x = { -1, -2, ~1 };
    static struct hy y = { ~2, -1, -66 };

    return (x.a == y.a && (x.b & ~64) == y.b);
}

int
h3()
{
    static struct hx x = { -33, -18, ~1 };
    static struct hy y = { ~2, -9, -66 };

    return ((x.a & ~8) == (y.a & ~32) && (x.b & ~64) == (y.b & ~16));
}

int
h4()
{
    static struct hx x = { 0x0010, 0x0020, ~1 };
    static struct hy y = { ~2, 0x0100, 0x0200 };

    return ((x.a & 0x00f0) == (y.a & 0x0f00) &&
        (x.b & 0x00f0) == (y.b & 0x0f00));
}

int
h5()
{
    static struct hx x = { 0x0100, 0x0200, ~1 };
    static struct hy y = { ~2, 0x0010, 0x0020 };

    return ((x.a & 0x0f00) == (y.a & 0x00f0) &&
        (x.b & 0x0f00) == (y.b & 0x00f0));
}

int
h6()
{
    static struct hx x = { 0xfd10, 0xfe20, ~1 };
    static struct hy y = { ~2, 0xc11f, 0xc22f };

    return ((x.a & 0x03ff) == (y.a & 0x3ff0) &&
        (x.b & 0x03ff) == (y.b & 0x3ff0));
}

int
h7()
{
    static struct hx x = { 0xc11f, 0xc22f, ~1 };
    static struct hy y = { ~2, 0xfd10, 0xfe20 };

    return ((x.a & 0x3ff0) == (y.a & 0x03ff) &&
        (x.b & 0x3ff0) == (y.b & 0x03ff));
}

int
int main(){
  if (!a1 ())
    abort ();
  if (!a2 ())
    abort ();
  if (!a3 ())
    abort ();
  if (!b1 ())
    abort ();
  if (!b2 ())
    abort ();
  if (!b3 ())
    abort ();
  if (!c1 ())
    abort ();
  if (!c2 ())
    abort ();
  if (!c3 ())
    abort ();
  if (!d1 ())
    abort ();
  if (!d2 ())
    abort ();
  if (!d3 ())
    abort ();
  if (!e1 ())
    abort ();
  if (!e2 ())
    abort ();
  if (!e3 ())
    abort ();
  if (!e4 ())
    abort ();
  if (!f1 ())
    abort ();
  if (!f2 ())
    abort ();
  if (!f3 ())
    abort ();
  if (!f4 ())
    abort ();
  if (!g1 ())
    abort ();
  if (!g2 ())
    abort ();
  if (!g3 ())
    abort ();
  if (g4 ())
    abort ();
  if (g5 ())
    abort ();
  if (!g6 ())
    abort ();
  if (!g7 ())
    abort ();
  if (!h1 ())
    abort ();
  if (!h2 ())
    abort ();
  if (!h3 ())
    abort ();
  if (h4 ())
    abort ();
  if (h5 ())
    abort ();
  if (!h6 ())
    abort ();
  if (!h7 ())
    abort ();
  exit (0);
}

with common.h:

#pragma once

#include <stdio.h>
#include <string.h>

#define register

#define double float

#define __attribute__(x)

#define __complex__

#define NULL (void *)0

static void abort()
{
    printf("** TEST FAILED **!\n");
}

static void abort2(const char *msg)
{
    printf("%s\n", msg);
    printf("** TEST FAILED **!\n");
}
drmortalwombat commented 1 month ago

Fixed

AGPX commented 1 month ago

Test passed.