Commit Graph

88 Commits

Author SHA1 Message Date
Doug Gregor
c522138987 [Strict memory safety] Union member accessors are always unsafe
Union member accessors have no way to know what the "active field" is,
so consider them to always be unsafe.
2025-04-02 16:59:17 -07:00
Doug Gregor
b182c96bd7 Print diagnostic group names by default
Print diagnostic groups as part of the LLVM printer in the same manner as the
Swift one does, always. Make `-print-diagnostic-groups` an inert option, since we
always print diagnostic group names with the `[#GroupName]` syntax.

As part of this, we no longer render the diagnostic group name as part
of the diagnostic *text*, instead leaving it up to the diagnostic
renderer to handle the category appropriately. Update all of the tests
that were depending on `-print-diagnostic-groups` putting it into the
text to instead use the `{{documentation-file=<file name>}}`
diagnostic verification syntax.
2025-03-29 15:40:56 -07:00
Doug Gregor
8a8e108cae Stop propagating @unsafe/@safe from type definitions down to their members 2025-03-27 16:48:09 -07:00
Doug Gregor
8789871035 Diagnose @safe @unsafe when used together
Fixes rdar://147943857.
2025-03-27 16:28:44 -07:00
Doug Gregor
d86f41a922 Improve Fix-It for if let x where x is a reference to an unsafe value
When we encounter unsafe code in `if let x`, we would produce a Fix-It
that would change it to the ill-formed `if let unsafe x`. Improve
tracking of the expressions that are synthesized for the right-hand
side of these conditions, so that we can produce a Fix-It that turns
this into the proper

    if let x = unsafe x

Fixes rdar://147944243.
2025-03-27 16:20:30 -07:00
Doug Gregor
90a2b3d8a0 Look through "unsafe" expressions when checking for single-value statements
We were rejecting the use of switch expressions on the right-hand side
of an assignment that was marked `unsafe`. Fixes rdar://147944753.
2025-03-27 09:49:34 -07:00
Doug Gregor
1b2fad1e78 Properly recurse when removing "unsafe" from inlinable code
I forgot that I have to manually recurse in the syntactic rewriter. Do so.
Fixes rdar://147877042
2025-03-25 16:27:37 -07:00
Doug Gregor
9570e1e3a7 [SE-0458] Add fix-it for removing unnecessary "unsafe" keywords 2025-03-18 13:57:16 -07:00
Doug Gregor
4742d2c5db [SE-0458] withoutActuallyEscaping is unsafe for @convention(block)
The implementation of `withoutActuallyEscaping` for `@convention(block)`
functions cannot verify at runtime that the function did not actually
escape. Diagnose this as unsafe code under strict memory safety checking.

Fixes rdar://139994149.
2025-03-18 13:26:47 -07:00
Doug Gregor
81e8f75f93 [Strict memory safety] Eliminate false cycle when checking nonisolated(unsafe)
Whenc hecking for nonisolated(unsafe), don't evaluate the full isolation
of the entity, because doing so causes a reference cycle.
2025-03-10 22:59:50 -07:00
Doug Gregor
b9cb5ce791 [SE-0458] Disambiguate "unsafe" expression within string interpolation
String interpolation uses an end-of-file token, which we weren't
checking for. Fixes rdar://146493296
2025-03-07 15:10:27 -08:00
Doug Gregor
6cf56e9eb7 SE-0458: Disambiguate postfix expressions vs. unsafe expressions more generally
Handle call-vs-tuple and subscript-vs-collection-expr disambiguation using the
same "no trivia" rule that we used to disambiguite "unsafe.x" (which we
treat as a member access) from "unsafe .x" (which we treat as an unsafe
expression with a leading-dot member access).

Fixes rdar://146459104.
2025-03-07 10:19:26 -08:00
Doug Gregor
be7e87565c [SE-0458] Improved disambiguation for unsafe expressions
Disambiguate `unsafe` in a few more common contexts:
* Before a comma in a list of whatever form
* Before a left brace somewhere that we cannot have a closure

Fixes a few more source compatibility regressions found in the wild,
rdar://146125433.
2025-03-04 12:54:06 -08:00
Doug Gregor
a1180e570c More disambiguation for "unsafe" expressions
Fixes rdar://145870868 / #79704
2025-02-28 14:46:42 -08:00
Doug Gregor
c7f9f2ee3a Rename "Unsafe" diagnostic group to "StrictMemorySafety"
This lines up with the feature name and is more consistent. Thank you,
Anthony, for the suggestion.
2025-02-27 16:21:11 -08:00
Doug Gregor
7c7ea1dfd5 [SE-0458] Suppress "no unsafe operations" warnings outside of strict mode
This is a stop-gap solution to prevent spurious warnings when "unsafe"
expressions and for..in loops are used without strict memory safety.

The full answer is probably to determine where unsafe code is all the time,
so that we can still (correctly) diagnose "no unsafe operations" even outside
of strict memory safety mode.
2025-02-27 09:20:36 -08:00
Doug Gregor
69302f9c1c Merge pull request #79655 from DougGregor/se-0458-condfails
[SE-0458] Improve backward compatibility of generated Swift interfaces
2025-02-27 02:55:24 -08:00
Doug Gregor
ae6ae33201 [SE-0458] Drop "unsafe" effect for for..in loop in inlined code in interfaces
Only compilers can't handle it, so drop it for now.
2025-02-26 22:06:48 -08:00
Doug Gregor
983046f792 [SE-0458] Suppress @unsafe conformances for compilers that can't handle them 2025-02-26 22:06:45 -08:00
Doug Gregor
0c130a995c Make test robust against strict memory safety changes to the standard library 2025-02-26 14:28:22 -08:00
Doug Gregor
998dea25be Update module-trace tests for strictly memory-safe standard libraries 2025-02-26 14:28:20 -08:00
Doug Gregor
939d4d7d91 [SE-0458] Disambiguate "unsafe" expression and for..in effect
Port over the disambiguation code we already had in the new Swift parser
to the existing C++ parser for the "unsafe" expression and for..in effect.
2025-02-26 13:03:55 -08:00
Doug Gregor
b7b5a2a19d [SE-0458] Enable unsafe expressions / attributes / for..in effects by default
With the acceptance of SE-0458, allow the use of unsafe expressions, the
@safe and @unsafe attributes, and the `unsafe` effect on the for..in loop
in all Swift code.

Introduce the `-strict-memory-safety` flag detailed in the proposal to
enable strict memory safety checking. This enables a new class of
feature, an optional feature (that is *not* upcoming or experimental),
and which can be detected via `hasFeature(StrictMemorySafety)`.
2025-02-26 12:30:07 -08:00
Doug Gregor
29d904f09d [SE-0458] Don't warn about unsafe conformances outside of strict safety mode 2025-02-24 17:20:01 -08:00
Doug Gregor
50801f9c05 [SE-0458] Implement "unsafe" effect for the for-in loop
Memory unsafety in the iteration part of the for-in loop (i.e., the part
that works on the iterator) can be covered by the "unsafe" effect on
the for..in loop, before the pattern.
2025-02-23 22:50:39 -08:00
Doug Gregor
6e4f711a55 Merge pull request #79512 from DougGregor/unsafe-storage-checking-generic
Fix declaration context for unsafe storage checking
2025-02-20 02:21:30 -10:00
Doug Gregor
c308cfd26a Fix declaration context for unsafe storage checking
Fix a compiler crash involving checking of generic types for unsafe
storage.
2025-02-19 21:31:20 -10:00
Doug Gregor
13c82c6f78 Remove "unsafe" keyword from expressions when printing inlinable code
To help older compilers that don't yet support the unsafe expression
deal with the Swift interface files we produce, remove the "unsafe" from
expressions in inlinable code.
2025-02-18 07:14:18 -10:00
Doug Gregor
c0fb9f990a [Strict memory safety] Infer safe/unsafe for imported C types 2025-02-16 00:55:43 -08:00
Doug Gregor
4313f6790c [Strict memory safety] Diagnose unsafe types in the superclass of a class 2025-02-15 22:57:54 -08:00
Doug Gregor
c9cfed2007 [Strict safety] Diagnose types with unsafe storage
When a type definition involves unsafe types in its storage, require it
to be explicitly marked @unsafe or @safe.
2025-02-15 22:42:07 -08:00
Doug Gregor
2de9f4a8f5 [Strict safety] Stop complaining about unsafe signatures
Since we infer unsafety from a use of a declaration that involves unsafe types
in its signature, there isn't a reason to require @unsafe on declaration to
restate it. This matches recent revisions of SE-0458.
2025-02-15 22:02:22 -08:00
Doug Gregor
02ada804f1 More temporary test fixes 2025-02-10 17:10:52 -08:00
Doug Gregor
05113a69fb Fixup test case based on limitations of the existing implementation 2025-02-10 16:08:37 -08:00
Doug Gregor
260ade8076 [Unsafe] Teach for..in loops to let the sequence's 'unsafe' cover next()
Warnings about unsafe uses due to an @unsafe IteratorProtocol conformance
(for the implicit call to next()) could not be silenced. Follow the same
path we did for the Sequence conformance (and makeIterator() call) by
associating it with the `unsafe` on the sequence argument.

This isn't the only solution here, but it's a reasonable one.
2025-02-10 14:59:15 -08:00
Doug Gregor
bda17b087c Merge pull request #79265 from DougGregor/unsafe-fixit-fixes
Fix Fix-It locations for "unsafe" insertion
2025-02-10 13:12:25 -08:00
Doug Gregor
929836d212 Fix Fix-it location 2025-02-10 08:26:17 -08:00
Doug Gregor
54124193cf Look past autoclosures when determining where to insert "unsafe" in a Fix-It
Otherwise, we'll end up inserting the "unsafe" on the right-hand side of an &&
2025-02-10 06:54:17 -08:00
Doug Gregor
1cbeee6fed Fix Fix-It location for "unsafe" when calling an initializer
The implicit reference to the initializer was tripping up the logic
for finding the appropriate place to insert "unsafe", and it was ending
up in the middle of the expression.
2025-02-10 06:54:15 -08:00
Doug Gregor
4a9e8906fb Handle unsafe expressions in yield statements 2025-02-10 06:22:41 -08:00
Doug Gregor
4139430560 @safe functions, properties, and subscripts "cover" certain unsafe arguments
When calling an explicitly-@safe function or subscript, or accessing an
explicitly-@safe property, the direct arguments to that operation can be
considered safe if they are references to local variables or are references
to types.

This brings the implementation in line with the recent adjustments to the
proposal within the review.
2025-02-08 10:18:12 -08:00
Doug Gregor
bd237c7daf Make sure we aren't requiring local let/var to be labeled @unsafe 2025-01-23 07:47:20 -08:00
Doug Gregor
b3f2f00588 Suggest both @unsafe and @safe Fix-Its for unsafe types in signature 2025-01-23 07:47:19 -08:00
Doug Gregor
4395537fa0 Introduce the @safe attribute as described in the opt-in safety checking proposal 2025-01-23 07:47:17 -08:00
Doug Gregor
2fc9ac08ca Handle autoclosures for 'unsafe' effects checking 2025-01-11 12:43:43 -08:00
Doug Gregor
fc632b2c53 Check 'unsafe' within keypaths 2025-01-11 12:43:43 -08:00
Doug Gregor
d6c020d843 Diagnose 'unsafe' within explicit references to types in expressions 2025-01-11 12:43:43 -08:00
Doug Gregor
446474499a Diagnose unsafe sequences in the for..in loop
The `unsafe` goes on the sequence expression, e.g.,

    for x in unsafe mySequence { ... }
2025-01-11 12:43:42 -08:00
Doug Gregor
d787c0fab3 Extend effects checking to the various expressions that reference declarations
Only "unsafe" checking is affected here.
2025-01-11 12:43:42 -08:00
Doug Gregor
37bfa1998e Tighten up checking for uses of unsafe conformances
Check for unsafe conformances for type erasure and opaque type
erasure.

This also uncovered an issue where we were making every conformance of
an unsafe type to an unsafe protocol @unsafe implicitly, even though
that's not really what we want.
2025-01-11 12:43:41 -08:00