Commit Graph

22474 Commits

Author SHA1 Message Date
Doug Gregor
02d7357a73 Diagnose references to unowned(unsafe) variables as unsafe uses 2024-12-20 07:35:33 -08:00
Doug Gregor
0ef32ac5b5 Diagnose references to nonisolated(unsafe) declarations in strict-concurrency code
A nonisolated(unsafe) declaration clearly indicates that the
declaration itself is unsafe, so it doesn't need to be diagnosted.
Instead, diagnose any reference to such a declaration that occurs
when strict concurrency is enabled. Make this a collatable unsafe use.
2024-12-20 07:35:23 -08:00
Doug Gregor
29f23bb66a Improve diagnostics for uses of unsafe declarations in functions
Instead of producing a warning for each use of an unsafe entity,
collect all of the uses of unsafe constructs within a given function
and batch them together in a single diagnostic at the function level
that tells you what you can do (add `@unsafe` or `@safe(unchecked)`,
depending on whether all unsafe uses were in the definition), plus
notes identifying every unsafe use within that declaration. The new
diagnostic renderer nicely collects together in a single snippet, so
it's easier to reason about.

Here's an example from the embedded runtime that previously would have
been 6 separate warnings, each with 1-2 notes:

```
swift/stdlib/public/core/EmbeddedRuntime.swift:397:13: warning: global function 'swift_retainCount' involves unsafe code; use '@safe(unchecked)' to assert that the code is memory-safe
395 |
396 | @_cdecl("swift_retainCount")
397 | public func swift_retainCount(object: Builtin.RawPointer) -> Int {
    |             `- warning: global function 'swift_retainCount' involves unsafe code; use '@safe(unchecked)' to assert that the code is memory-safe
398 |   if !isValidPointerForNativeRetain(object: object) { return 0 }
399 |   let o = UnsafeMutablePointer<HeapObject>(object)
    |           |                              `- note: call to unsafe initializer 'init(_:)'
    |           `- note: reference to unsafe generic struct 'UnsafeMutablePointer'
400 |   let refcount = refcountPointer(for: o)
    |                  |                    `- note: reference to let 'o' involves unsafe type 'UnsafeMutablePointer<HeapObject>'
    |                  `- note: call to global function 'refcountPointer(for:)' involves unsafe type 'UnsafeMutablePointer<Int>'
401 |   return loadAcquire(refcount) & HeapObject.refcountMask
    |          |           `- note: reference to let 'refcount' involves unsafe type 'UnsafeMutablePointer<Int>'
    |          `- note: call to global function 'loadAcquire' involves unsafe type 'UnsafeMutablePointer<Int>'
402 | }
403 |
```

Note that we have lost a little bit of information, because we no
longer produce "unsafe declaration was here" notes pointing back at
things like `UnsafeMutablePointer` or `recountPointer(for:)`. However,
strict memory safety tends to be noisy to turn on, so it's worth
losing a little bit of easily-recovered information to gain some
brevity.
2024-12-20 07:34:51 -08:00
Doug Gregor
b3763eed7b Encapsulate each kind of "unsafe use" in a value we can safe to replay
For now, just use this as an intermediate state to provide a single
place to render diagnostics.
2024-12-20 07:34:48 -08:00
Allan Shortlidge
57cce71fc2 Merge pull request #78308 from tshortli/adopt-semantic-available-attr 2024-12-20 00:51:40 -08:00
Anthony Latsis
cd1ef24c49 Merge pull request #78309 from AnthonyLatsis/nymphaea
Assortment of small fixes and cleanups
2024-12-20 06:51:19 +00:00
eeckstein
e6b9cb986f Merge pull request #78290 from eeckstein/sil-infrastructure
Some AST and SIL infrastructure additions and improvements
2024-12-20 07:18:32 +01:00
Becca Royal-Gordon
413c673da4 [NFC] Requestify ABI role computation 2024-12-19 21:22:08 -08:00
Anthony Latsis
97a59c1dc8 TypeCheckType: Do not form protocol type with generic parent in resolveTypeInContext 2024-12-20 02:57:29 +00:00
Anthony Latsis
8b941e6a84 AST: Fix the superclasses of some type nodes 2024-12-20 02:57:29 +00:00
Anthony Latsis
855c5758d2 [NFC] AST: Clean up unused field and parameter in LocalArchetypeType subclasses 2024-12-20 02:57:29 +00:00
Anthony Latsis
7793f638d5 [NFC] AST: Consolidate some repeated DependentMemberType logic in Type methods 2024-12-20 02:47:29 +00:00
Allan Shortlidge
00aae6ead5 AST: Return SemanticAvailableAttr from Decl::getUnavailableAttr(). 2024-12-19 17:22:51 -08:00
Allan Shortlidge
055a9ecd07 AST: Return a SemanticAvailableAttr from Decl::getDeprecatedAttr(). 2024-12-19 17:22:51 -08:00
Allan Shortlidge
2bc0427279 AST: Update isBetterThan() to take SemanticAvailableAttrs. 2024-12-19 17:22:51 -08:00
Allan Shortlidge
000c9da3ed AST: Return SemanticAvailableAttr from Decl::getActiveAvailableAttrForCurrentPlatform(). 2024-12-19 17:22:51 -08:00
Allan Shortlidge
2ca2237767 AST: Return a SemanticAvailableAttr from Decl::getNoAsyncAttr(). 2024-12-19 17:22:51 -08:00
Allan Shortlidge
0de339db1c AST: Introduce a SemanticAvailableAttr::isNoAsync() convenience. 2024-12-19 17:22:04 -08:00
Allan Shortlidge
ff83bf3f60 AST: Consistently use SemanticAvailableAttr's getDomain() accessor.
This allows the storage of the AvailabilityDomain to change in the future.
2024-12-19 17:22:04 -08:00
Becca Royal-Gordon
9c1e00ce52 [ASTGen] Lower @abi in ASTGen 2024-12-19 15:49:35 -08:00
Becca Royal-Gordon
201ccaf053 [NFC] [ASTGen] Refactor attribute attachment
Use `Decl::attachParsedAttrs()` instead of `Decl::setAttrs()` to attach attributes to a declaration in ASTGen. This causes the common attribute-setup logic there to be run.

NFC in this commit because none of the attributes that have special setup logic are currently implemented in ASTGen. Prepares to add support for `@abi` in a future commit.
2024-12-19 15:49:35 -08:00
Becca Royal-Gordon
443bd5d4ad Diagnose use of @_silgen_name and @abi together 2024-12-19 15:49:35 -08:00
Becca Royal-Gordon
0d34b4da5b Print @abi into module interface (suppressibly) 2024-12-19 15:49:34 -08:00
Becca Royal-Gordon
0f3cf62c55 Use @abi attribute in mangling
What’s implemented now is actually *far* more thorough than what the surface syntax can currently express, mainly because I can’t apply @abi to nominal types yet.
2024-12-19 15:49:34 -08:00
Becca Royal-Gordon
c91cf69f2f Add some basic validation of vars and funcs
Check for:

• Matching decl kinds
• Matching PBD shapes (does every VarDecl on both sides have a counterpart?)
• Matching function effects
• Matching function arity (roughly)
2024-12-19 15:49:34 -08:00
Becca Royal-Gordon
08e2a4ddae Type check ABI decls
Sema now type-checks the alternate ABI-providing decls inside of @abi attributes.

Making this work—particularly, making redeclaration checking work—required making name lookup aware of ABI decls. Name lookup now evaluates both API-providing and ABI-providing declarations. In most cases, it will filter ABI-only decls out unless a specific flag is passed, in which case it will filter API-only decls out instead. Calls that simply retrieve a list of declarations, like `IterableDeclContext::getMembers()` and friends, typically only return API-providing decls; you have to access the ABI-providing ones through those.

As part of that work, I have also added some basic compiler interfaces for working with the API-providing and ABI-providing variants. `ABIRole` encodes whether a declaration provides only API, only ABI, or both, and `ABIRoleInfo` combines that with a pointer to the counterpart providing the other role (for a declaration that provides both, that’ll just be a pointer to `this`).

Decl checking of behavior specific to @abi will come in a future commit.

Note that this probably doesn’t properly exercise some of the new code (ASTScope::lookupEnclosingABIAttributeScope(), for instance); I expect that to happen only once we can rename types using an @abi attribute, since that will create distinguishable behavior differences when resolving TypeReprs in other @abi attributes.
2024-12-19 15:49:34 -08:00
Becca Royal-Gordon
01b8bbea89 Tie attributes to language features
The new `DECL_ATTR_FEATURE_REQUIREMENT` macro in DeclAttr.def can be used to declare that an attribute should only be available when a related language feature is enabled.

Effects:

• `#if hasAttribute(someAttr)` will return `false` unless the required feature is enabled.
• Code completion will not include the attribute unless the required feature is enabled.
• `TypeChecker::checkDeclAttributes()` diagnoses non-implicit uses of the attribute.

Add this mechanism and use it to tie @abi to the ABIAttribute feature. Also design tests for it.
2024-12-19 15:49:34 -08:00
Becca Royal-Gordon
94ff062edd Parse and serialize @abi attribute
This attribute will allow you to specify an alternate version of the declaration used for mangling. It will allow minor adjustments to be made to declarations so long as they’re still compatible at the calling convention level, such as refining isolation or sendability, renaming without breaking ABI, etc.

The attribute is behind the experimental feature flag `ABIAttribute`.
2024-12-19 15:48:54 -08:00
Becca Royal-Gordon
c9f539e146 [NFC] Extract autodiff parsing code to Decl.cpp
The `@differentiable` and `@derivative` attributes need a parent pointer. Move the code to populate it from Parser to AST so it can be more easily shared between the parsers.

Done in preparation for similar code to be added for `@abi`.
2024-12-19 15:47:07 -08:00
Becca Royal-Gordon
9b947f90d4 [NFC] Improve lookup flag printing facilities 2024-12-19 15:47:07 -08:00
Becca Royal-Gordon
9f0130b6b6 [NFC] Dump an ASTScopeImpl’s parent nodes 2024-12-19 15:47:07 -08:00
Becca Royal-Gordon
2d0b54bb95 [ClangImporter] Try to warn about missing types 2024-12-19 15:47:07 -08:00
Ben Barham
a2fda1d9f3 [Embedded] Do not produce cannot_specialize_class for live issues
SourceKit explicitly disables WMO, silence the diagnostic in this case
(but leave it enabled for explicit non-WMO builds otherwise).
2024-12-19 15:31:41 -08:00
Allan Shortlidge
965ee8fc63 Merge pull request #78284 from tshortli/semantic-available-attr
AST: Introduce `SemanticAvailableAttr`
2024-12-19 13:05:01 -08:00
Erik Eckstein
4fdf16de1b SIL: add CanonicalType.canBeClass
And move the implementation of `SIL.Type.canBeClass` to the AST Type. The SIL Type just calls the AST Type implementation.
Also rename `SIL.Type.canonicalASTType` -> `SIL.Type.astType`.
2024-12-19 20:53:46 +01:00
Erik Eckstein
1545e01ab5 SIL: Let SubstitutionMap.replacementTypes return AST types rather than optional SIL types.
This is what the C++ SubstitutionMap does. One has to use `Type.loweredType` to get from the AST type to the SIL type.
2024-12-19 20:53:45 +01:00
Paul LeMarquand
ae88aaca8f Merge pull request #78280 from swiftlang/revert-77140-swift-lexical-lookup-validation
Revert "[SwiftLexicalLookup] New unqualified lookup implementation validation"
2024-12-19 12:40:31 -05:00
Allan Shortlidge
111661e1d2 AST: Move several queries to SemanticAvailableAttr. 2024-12-19 08:40:01 -08:00
Allan Shortlidge
17dfbf5053 AST: Adopt SemanticAvailableAttr for SpecializeAttr. 2024-12-19 08:40:00 -08:00
Allan Shortlidge
f42ca1e758 AST: Introduce Decl::getSemanticAvailableAttr().
This convenience returns an optional `SemanticAvailableAttr` (since in the
future, lookup of the `AvailabilityDomain` can fail). It replaces
`Decl::getDomainForAvailableAttr()`, since most callers will need to form a
`SemanticAvailableAttr` with the resulting domain anyways.
2024-12-19 08:40:00 -08:00
Allan Shortlidge
6ce7e3cc8a AST: Adopt SemanticAvailableAttr in attribute printing. 2024-12-19 08:40:00 -08:00
Allan Shortlidge
88345f9eeb AST: Remove the unused SuppressNoAsyncAvailabilityAttr print option. 2024-12-19 08:40:00 -08:00
Allan Shortlidge
887bc1124f ConstExtract: Adopt Decl::getSemanticAvailableAttrs(). 2024-12-19 08:40:00 -08:00
Allan Shortlidge
0288eaa3b7 AST: Introduce Decl::getSemanticAvailableAttrs().
This new attribute iterator returned from the query makes it simpler to
implement algorithms that need access to both the `AvailableAttr *` and its
corresponding `AvailabilityDomain`. This is also work towards making it
possible to return an optional `AvailabilityDomain` from
`Decl::getDomainForAvailableAttr()`.
2024-12-19 08:40:00 -08:00
Ben Barham
e06d0b9357 Revert "[SwiftLexicalLookup] New unqualified lookup implementation validation" 2024-12-18 15:04:16 -08:00
Steven Wu
4f7ffcc99a [MCCAS] Fix uninitialzied variables in CASID file output
Fix uninitalized variables in IRGen options. Those options are
initialized with `|=` so it is important to initialize them to false.
2024-12-18 14:44:00 -08:00
Jakub Florek
5dbe202087 Merge pull request #77140 from MAJKFL/swift-lexical-lookup-validation
[SwiftLexicalLookup] New unqualified lookup implementation validation
2024-12-18 17:29:47 +01:00
Pavel Yaskevich
636525ebd9 Merge pull request #78171 from xedin/rdar-140300022
[TypeChecker/SILGen] Allow `any Sendable` to match `Any` while matching generic arguments
2024-12-17 20:24:34 -08:00
Hiroshi Yamauchi
283ce7fa35 Merge pull request #78222 from hjyamauchi/fingerprint
Avoid build error with Visual Studio 17.8.7 MSVC 19.38.33135.0 compiler
2024-12-17 09:34:57 -08:00
Slava Pestov
8eb9e745a6 Merge pull request #78225 from slavapestov/optimized-shifts
Sema: Filter out protocol extension default implementations of operators
2024-12-17 07:44:10 -05:00