Skip to content

Prism v1.1.6

Choose a tag to compare

@dawnlarsson dawnlarsson released this 01 Aug 16:07
· 18 commits to main since this release

Prism 1.1.6 fixes 41 issues with new procedural test suite with 45,496 test cells, performance is 1.25x faster than 1.1.5 and 1.59x faster than 1.1.4. Warm cached builds are 2.87x faster than 1.1.4.

new test suit measured coverage is 93.35% lines, 75.23% branches, and 99.05% functions.

fixes

  1. Separate-argument compiler flags are parsed correctly. This includes -isysroot, -imultilib, -aux-info, -dumpbase, -dumpbase-ext, -dumpdir, -wrapper, --param, and supported ld64 flags. SDK paths no longer become extra source files on macOS.
  2. A block-comment line ending in \ no longer causes the next live #define to disappear in non-flatten mode.
  3. Function-like macros now use a valid identifier-only guard. #define SUM(a,b) is guarded by #ifndef SUM, not #ifndef SUM(a,b).
  4. idx[&(a[0])] and equivalent nested forms can no longer bypass commutative-subscript rejection.
  5. Pointer-arithmetic dereferences after braceless if, while, for, and switch statements are rejected instead of passing through unchecked.
  6. Address expressions after braceless control conditions no longer receive a false runtime check on a legal one-past pointer.
  7. }, ++, and -- are recognized as value tokens when distinguishing binary & from address-of, so the following subscript remains checked.
  8. Address-of suppression now spans parentheses. &(a[n]) permits the same legal one-past pointer as &a[n].
  9. The Windows mkstemps shim rejects templates without replacement X characters instead of opening a predictable fixed path.
  10. The first library call targeting MSVC now emits matching MSVC diagnostic pragmas. It no longer starts with a GCC push and ends with an MSVC pop.
  11. --prism-verify now counts dialect keywords with the tokenizer. Raw strings, prefixes, UCNs, digraphs, comments, and macro shadowing can no longer hide a leaked defer or orelse token.
  12. Nested groups in a defer expression now share the 4096-level parser limit. Excessive nesting reports a diagnostic instead of overflowing the stack.
  13. setjmp taint now propagates through same-file call edges, preventing defer in callers that can be bypassed by longjmp.
  14. Casted calls such as (void)wrapper(p) no longer hide transitive setjmp or vfork taint.
  15. Calls to a declared function named defer keep their arguments. defer(1) is no longer mistaken for the language construct.
  16. Calls through a function-pointer value named defer are preserved for local, ANSI parameter, typedef parameter, and K&R parameter forms.
  17. Library-mode defer inside an unresolved preprocessor arm is rejected instead of being moved outside the conditional and made unconditional.
  18. A do-while block containing trailing defer in a GNU statement expression now receives the same required diagnostic as equivalent block forms.
  19. C23 constexpr values are treated as integer constant expressions for array sizing instead of as VLAs.
  20. A parameter shadowing a constexpr binding now restores VLA behavior inside the function.
  21. File-scope symbol discovery now requires a valid function declarator. defer (void)0; can no longer register defer as a function and evade the file-scope diagnostic.
  22. Unevaluated state now survives nested delimiters and comma expressions in sizeof, typeof, and _Generic control expressions. _Generic association expressions remain evaluated.
  23. Qualifiers inside balanced sizeof, alignof, and offsetof operands no longer leak into the result type of an enclosing typeof.
  24. Const typeof objects use a declaration initializer when legal instead of delayed byte writes through a const object.
  25. Direct typeof(variable) lookup preserves atomic qualification. Unsupported const atomic zero initialization now reports a diagnostic.
  26. Direct typeof(variable) lookup preserves const qualification, while typeof_unqual removes it.
  27. Typedefs derived from typeof retain that origin through alias chains, preserving whole-object initialization for types such as x86 long double.
  28. Top-level volatile and _Atomic qualifiers on pointer declarators and pointer typedefs are no longer confused with pointee qualifiers.
  29. ANSI parameters retain exact const, volatile, atomic, pointer, and adjusted-array traits for typeof lookup.
  30. K&R parameter declarations now register const, volatile, atomic, and long-double traits instead of only VLA traits.
  31. Direct, typedef, complex, and volatile x86 long double locals now clear the full object, including x87 padding bytes.
  32. Every link in a chained bare-assignment orelse now receives the variably-modified side-effect check. Middle links can no longer evaluate twice.
  33. A declaration fallback ending in a preprocessor directive now places its generated semicolon after the directive line instead of producing #endif;.
  34. A nonzero PrismFeatures array count with a NULL array pointer is normalized safely instead of dereferencing NULL.
  35. Sparse define, include, flag, and forced-include arrays are checked by every consumer, including non-flatten re-emission.
  36. Negative feature-array counts are normalized before capacity arithmetic, preventing integer overflow.
  37. prism_transpile_file(NULL, ...) returns a deterministic IO error without invoking the compiler.
  38. Removing raw at the start of a line now preserves the newline. Declarations after pragmas no longer merge into the pragma line.
  39. prism install creates missing parent directories such as $HOME/.local/bin instead of failing and retrying with sudo.
  40. Reinstalling through a symlink, relative path, hard link, or path containing /../ recognizes the existing binary by file identity and avoids copying it onto itself.
  41. All ten feature flags accept positive and negative forms. Prism consumes only exact feature names, so unrelated flags such as -fdefer-pop and -fno-strict-aliasing still reach the backend.