aboutsummaryrefslogtreecommitdiff
path: root/test
AgeCommit message (Collapse)Author
2024-03-29Use C23 keywords in test dataMichael Forney
2024-03-24decl: Implement GNU packed attributeMichael Forney
Implements: https://todo.sr.ht/~mcf/cproc/72
2024-03-24Add support for C23 attribute syntaxMichael Forney
Currently, all attributes are ignored. References: https://todo.sr.ht/~mcf/cproc/68
2024-03-23Add test for unreachable statementsMichael Forney
This used to trigger a bug. References: https://todo.sr.ht/~mcf/cproc/80
2024-03-23Add tests for standard enum typesMichael Forney
2024-03-23Change type of u8 string literals to unsigned char for C23Michael Forney
2024-03-22Implement C23 nullptr constantMichael Forney
2024-03-22decl: Implement typeof_unqualMichael Forney
2024-03-22Use C23 spelling of typeof in testsMichael Forney
2024-03-21decl: Add support for enums with large values and fixed underlying typesMichael Forney
Fixes: https://todo.sr.ht/~mcf/cproc/64
2024-03-16Fix C23 empty initializersMichael Forney
These should should act as zero initializers, but since init==NULL was used to mean both "no initializer" and "empty initializer", empty initializers weren't zero-initializing the variable.
2022-11-29Implement C23 predefined bool constantsMichael Forney
2022-08-05expr: Fix constant evaluation of struct member addressMichael Forney
fb00ba6978 had the side-effect of introducing an integer to pointer cast, which was not evaluated as a constant expression. To fix this, just set the type of the expression.
2022-06-13Fix tests for x86_64 -> x86_64-sysv target renameMichael Forney
2022-05-09expr: Use integer type for member access intermediate address calculationMichael Forney
2022-03-22init: Allow empty initializersMichael Forney
2022-03-22Add test for typeof on expression with array typeMichael Forney
2022-03-22Allow unnamed parameters in function definitionsMichael Forney
2022-02-10qbe: Switch to new unsigned-float conversion operatorsMichael Forney
2022-02-10qbe: Use new unary negation operatorMichael Forney
2022-01-22Handle unary minus specially instead of 0 - xMichael Forney
This is necessary to fix unary negation of floating-point 0 (also depends on a pending qbe patch).
2021-12-06decl: Fix typedefs with type qualifiersMichael Forney
Previously, the qualifiers were saved, but accidentally ignored when the typedef was referenced.
2021-12-06decl: Use strictest alignment when multiple specifiers are presentMichael Forney
This is specified by the last sentence in C11 6.7.5p6.
2021-10-25decl: Allow alignment > 16 of localsMichael Forney
This is not yet supported by QBE, so for now we allocate a bit extra and choose the address in the allocated region with an aligned address.
2021-10-25decl: Allow alignment > 16 of globals and struct membersMichael Forney
2021-10-25eval: Fix int-to-float conversionsMichael Forney
Also, add bounds checks for float-to-int conversions. If the integer part can't be represented in the result type, C behavior is undefined. Although this means the result is arbitrary, we need to avoid undefined behavior in cproc itself when given such a program as input.
2021-10-25qbe: Use ... to separate named and variadic argumentsMichael Forney
This requires a not-yet-upstream QBE patch, and is needed for riscv64 support, since the calling convention may be different depending on whether the argument is named or variadic.
2021-10-21expr: Add support for UTF-8 character constantsMichael Forney
2021-10-21expr: Implement binary integer constantsMichael Forney
These are in the latest C23 draft.
2021-10-20expr: Fix octal escapes followed by octal digitsMichael Forney
2021-10-20expr: Add support for wide string literalsMichael Forney
Thanks to Nihal Jere for his initial patches implementing this feature. Fixes #35.
2021-10-18expr: Make sure __builtin_va_end argument is evaluated for side-effectsMichael Forney
2021-10-18qbe: Fix jnz controlled by short/char typeMichael Forney
Although we don't need the cnew in this case, we still need to do the appropriate extension to 32-bit.
2021-10-02qbe: Re-add conversion to bool RHS of logical and/orMichael Forney
7e838669 removed conversion to bool for int expressions used only to control jnz, but incorrectly dropped the conversion for the right-hand-side of logical and/or as well. We need the result of the expression to be 0 or 1, so we still need that conversion.
2021-09-29eval: Allow subtraction in address constantsMichael Forney
2021-09-28expr: Skip codegen for unused expression in conditional with constant expressionMichael Forney
This compiles `0 ? e1 : e2` as `e2`, and `1 ? e1 : e2` as `e1` (while still adjusting the type as necessary).
2021-09-28Skip unnecessary conversion to bool for logical and conditional expressionsMichael Forney
As in ede6a5c9, if an expression is used only to control a jnz, we don't need to convert it to a 0 or 1 value. QBE ignores the upper 32-bits of the argument to jnz, so the conversion is still needed for pointer, long, and floating point types (including float since -0 has non-zero bit representation).
2021-09-14qbe: Fix temporary type for < 8 byte aligned struct copiesMichael Forney
2021-09-13Add test for string concatenation corner caseMichael Forney
2021-09-07expr: Fix varargs again and add more testsMichael Forney
2021-09-06Add tests for char/wchar_t signednessMichael Forney
2021-09-04Use architecture-specific va_list typeMichael Forney
Previously, cproc effectively used used typedef struct { /* 32 bytes, 8-byte aligned */ } __builtin_va_list[1]; However, this is not quite correct for x86_64 nor aarch64, though it was close enough for both to work in most cases. In actuality, for x86_64 we want typedef struct { /* 24 bytes, 8-byte aligned */ } __builtin_va_list[1]; and for aarch64 we want typedef struct { /* 32 bytes, 8-byte aligned */ } __builtin_va_list; The difference only appears when the size of va_list matters, or when va_list is passed as a parameter. However, the former is not often the case, and the aarch64 ABI replaces aggregate arguments with pointers to caller-allocated memory, which is quite similar to arrays decaying to pointers in C except that the struct is not copied. Additionally, riscv64 simply uses typedef void *__builtin_va_list; which again has a different size and calling convention. To fix this, make the __builtin_va_list type architecture-specific and use architecture-specific tests for varargs-related functionality.
2021-07-05qbe: Fix bitfield sign extension with types shorter than intMichael Forney
2021-07-02qbe: Remove more unnecessary copy instructionsMichael Forney
Now that we don't track QBE types within values, we don't have to worry about generating incorrect SSA when passing an 'l' value to a function taking a 'w'. So we can just return the source value instead of emitting a dummy copy instruction.
2021-07-01qbe: Remove unnecessary distinction between loaduw and loadswMichael Forney
We always store the result to a w temporary, so there is no difference. In fact, QBE provides loadw as an alias for loadsw precisely for this reason.
2021-07-01decl: Disallow members with incomplete typesMichael Forney
Make an exception for flexible array members, though we should also check that the flexible array member, if any, is last.
2021-06-30stmt: Check that controlling expression is a scalar, and drop unneeded ↵Michael Forney
conversion The conversion is only needed for floating types. QBE isn't able to optimize it away for integer types yet, so removing this unnecessary conversion has a substantial performance benefit.
2021-06-30qbe: Remove before unnecessary adds during copyMichael Forney
2021-05-02expr: Include NUL-terminator in string expression dataMichael Forney
This will facilitate the support of wide-string literals. Based on patch from Nihal Jere.
2021-04-22Update test for DBL_DECIMAL_DIGMichael Forney