Fix CodeGen assert failure for bounds-safe interfaces #869
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #861
This PR fixes a type-related assert that failed during code generation. The assertion was that the subexpression of an LValueToRValue cast had the same unqualified type as the destination type. However, this failed for cases involving bounds-safe interfaces. For example:
Since
cp
has a bounds-safe interface type of_Array_ptr<unsigned char>
, there is an implicit cast(_Array_ptr<const unsigned char>)cp
in the subexpression of the castLValueToRValue((_Array_ptr<const unsigned char>)cp)
. The destination type of the LValueToRValue cast isunsigned char *
. This caused the CodeGen asserthasSameUnqualifiedType(_Array_ptr<const unsigned char>, unsigned char *)
to fail.This PR introduces a new method
hasSameUnqualifiedUncheckedType
which returns true if two types are the same, ignoring qualifiers and the checkedness of any pointer types.hasSameUnqualifiedUncheckedType(_Array_ptr<const unsigned char>, unsigned char *)
returns true.Testing: