aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2019-02-19Add missing lvalue conversionsMichael Forney
typeintpromote and typeargpromote assume they are dealing with an unqualified type, and return an incorrect result if they are given a qualified one. So, add an assert here. This was causing const integer types to get promoted to themselves due to missing lvalue conversions. Thanks to Andrew Chambers for the bug report and test case.
2019-02-19Check that left hand side of assignment expression is an lvalueMichael Forney
2019-02-18Pointer operands to + and - must be complete object typesMichael Forney
Also clean up a little and give some better error messages.
2019-02-18void is an incomplete typeMichael Forney
2019-02-18Simplify test added in 9f964b7281Michael Forney
2019-02-18Fix compatible check for basic typesMichael Forney
This check was only supposed to return true for enum types and their corresponding integer type. However, it had the side effect of making 'int' compatible with 'unsigned'. To fix this, introduce a new basic type kind for enums with the same rank as 'int', that is only compatible with itself and the 'int' type with the matching sign. Thanks to Andrew Chambers for the bug report.
2019-02-17Make enum types compatible with their corresponding integer type (int)Michael Forney
2019-02-17Fix sizeof with unparenthesized postfix or compound literal expressionMichael Forney
Determining whether it is a typename or unparenthesized expression requires consuming the '(', so we need to call postfixexpr/parseinit ourselves.
2019-02-17Allow computing address of non-lvalue structs/unionsMichael Forney
We currently compile '.' member access as taking the address of the struct, adding the offset, and then dereferencing as the member type. However, the '.' operator is allowed on non-lvalues, even though the '&' operator is not. So, we need to handle arbitrary struct/union expressions in objectaddr by just compiling them normally, then converting them to regular pointers (since struct/union values are just pointers with additional type information).
2019-02-17Fix returning struct/union typesMichael Forney
2019-02-17Disallow functions returning array or functionMichael Forney
2019-02-17Only parse function definitions for function declarationsMichael Forney
2019-02-17Only need to read parameter declarations when identifier list is non-emptyMichael Forney
2019-02-17Ensure right number of arguments to non-prototype function definitionsMichael Forney
2019-02-17Improve old-style function declaration supportMichael Forney
Implement typecompatible for types created with non-prototype function declarations. Require a function definition with parameter declaration list after a declaration with a non-empty identifier list. Detect function definitions with parameter declaration lists containing types incompatible with the promoted types, and report an error for now.
2019-02-16Extend char/short types before comparingMichael Forney
Thanks to Andrew Chambers for reporting the issue.
2019-02-16Allow labels with same name as typedefMichael Forney
2019-02-16Fix casts from integer types less than 32 bits wideMichael Forney
2019-02-15Make sure that aggregates and pointers to aggregates are passed/return correctlyMichael Forney
2019-02-15Some small cleanupsMichael Forney
2019-02-15Handle main with no returnMichael Forney
2019-02-15Fix backwards constant evaluation of float-int castsMichael Forney
2019-02-15Don't embed anonymous struct members into parentMichael Forney
While this works nicely for structs, when unions are involved it makes it impossible to find the next member to initialize without keeping track of extra data per member.
2019-02-15Use bool typedef in .c filesMichael Forney
2019-02-15Rename emit.h -> backend.hMichael Forney
2019-02-15Use consume in a couple placesMichael Forney
2019-02-15Rearrange some fields in function typesMichael Forney
2019-02-15Remove a dead conditional in ftouMichael Forney
2019-02-15Fix some potential uninitialized fieldsMichael Forney
2019-02-15Initialize align variable in declspecsMichael Forney
This matches how it is done for storage class and function specifier.
2019-02-15Fix use of wrong align variable in structdeclMichael Forney
2019-02-15Fix hex escape in char literals.Andrew Chambers
2019-02-14Remove some leftover commented out stuffMichael Forney
2019-02-15Fix bad assertion.Andrew Chambers
2019-02-14Allow initializing array with longer stringsMichael Forney
2019-02-14Handle compound literals in global initializersMichael Forney
2019-02-14When subtracting pointers, divide after subtractionMichael Forney
The pointers might be global addresses, and it doesn't make sense to divide them before subtracting.
2019-02-13driver: Remove debug printfMichael Forney
2019-02-13driver: Ignore -std= and -pedanticMichael Forney
2019-02-13config.def.h: Define __signed__, used by linux headersMichael Forney
2019-02-13When storing initial value of parameters, use unqualified typeMichael Forney
2019-02-13Make __builtin_va_list a built-in declaration, not keywordMichael Forney
2019-02-13Fix decay on qualified array typesMichael Forney
2019-02-13Fold constexpr function into intconstexprMichael Forney
We usually only care about integer constant expressions, and when we parse initializers, we need to handle non-constant expressions too, so we call eval explicitly when emitting global data.
2019-02-13Add some missing lvalue conversionsMichael Forney
2019-02-13Ignore qualifiers when parsing initializersMichael Forney
2019-02-13Make basic store independent of ABIMichael Forney
2019-02-13Implement __builtin_va_argMichael Forney
2019-02-13Compare to node value first when looking for switch destinationMichael Forney
2019-02-13expr: Perform lvalue conversion on array and index in subscript expressionsMichael Forney