Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SE-0055: Making pointer nullability explicit #1878

Merged
merged 5 commits into from
Apr 12, 2016

Conversation

jrose-apple
Copy link
Contributor

What's in this pull request?

An implementation of SE-0055: Make unsafe pointer nullability explicit using Optional, which touches quite a few things across the compiler and standard library. I'm opening this pull request early even though the review session hasn't completed in anticipation of the proposal being accepted in some form.


Before merging this pull request to apple/swift repository:

  • The proposal needs to be accepted.
  • Tricky bits should be signed off by appropriate reviewers.
  • Test pull request on Swift continuous integration.
  • Have patches ready to go for the other projects (swiftpm, Foundation, etc)

Triggering Swift CI

The swift-ci is triggered by writing a comment on this PR addressed to the GitHub user @swift-ci. Different tests will run depending on the specific comment that you use. The currently available comments are:

Smoke Testing

Platform Comment
All supported platforms @swift-ci Please smoke test
OS X platform @swift-ci Please smoke test OS X platform
Linux platform @swift-ci Please smoke test Linux platform

Validation Testing

Platform Comment
All supported platforms @swift-ci Please test
OS X platform @swift-ci Please test OS X platform
Linux platform @swift-ci Please test Linux platform

Note: Only members of the Apple organization can trigger swift-ci.

@jrose-apple jrose-apple self-assigned this Mar 26, 2016
// non-object, non-block pointers are never Optional in Swift; they
// just can have a value of 'nil' themselves.
hint = ImportHint::CustomNullablePointer;
} else if (type->isPointerType() || type->isBlockPointerType()) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note for reviewers: the comment was wrong. Clang's isAnyPointerType includes pointers-to-ObjC-objects (covered above) and does not include block pointers.

@jrose-apple
Copy link
Contributor Author

Review requests:

(nil, nil, nil, nil)
}
var objects: [ObjectsBuffer]
var objects: [Unmanaged<AnyObject>?]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code was using inline storage to prevent an extra allocation for the array. Could you change it back?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what you mean. This is still inline storage.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or do single-element arrays have some magic I don't know about?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, sorry -- I didn't notice it was an array to begin with. I thought it used a struct of four pointers directly. Never mind then.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could probably consider doing that (going back to that?), but I'd make it a separate patch.

@jopamer
Copy link
Contributor

jopamer commented Mar 29, 2016

Sema changes look good to me.

@jrose-apple jrose-apple force-pushed the optional-pointers branch 2 times, most recently from 4993c11 to 89f800a Compare March 30, 2016 21:03
@jrose-apple
Copy link
Contributor Author

@swift-ci Please benchmark

@swift-ci
Copy link
Contributor

Build comment file:

Optimized (O)

Regression (0)

Improvement (1)

TEST OLD_MIN NEW_MIN DELTA (%) SPEEDUP
PopFrontArrayGeneric 1237 1132 -8.5% 1.09x

No Changes (114)

TEST OLD_MIN NEW_MIN DELTA (%) SPEEDUP
Array2D 2100 1991 -5.2% 1.05x
SetIntersect_OfObjects 3412 3243 -5.0% 1.05x(?)
ObjectiveCBridgeToNSDictionary 16176 15342 -5.2% 1.05x(?)
ErrorHandling 2817 2773 -1.6% 1.02x
NSDictionaryCastToSwift 10796 10625 -1.6% 1.02x(?)
ObjectiveCBridgeFromNSSetAnyObjectToString 187717 183178 -2.4% 1.02x(?)
DictionaryBridge 3738 3703 -0.9% 1.01x(?)
ObjectiveCBridgeFromNSDictionaryAnyObject 221048 218925 -1.0% 1.01x(?)
ObjectAllocation 142 141 -0.7% 1.01x(?)
StrComplexWalk 2754 2721 -1.2% 1.01x(?)
NSError 355 353 -0.6% 1.01x(?)
SetExclusiveOr_OfObjects 12648 12562 -0.7% 1.01x(?)
ObjectiveCBridgeStubFromArrayOfNSString 106926 105437 -1.4% 1.01x(?)
ObjectiveCBridgeToNSString 1034 1033 -0.1% 1.00x(?)
StackPromo 20600 20602 +0.0% 1.00x(?)
PopFrontArray 1224 1224 +0.0% 1.00x
RecursiveOwnedParameter 1829 1829 +0.0% 1.00x
ObjectiveCBridgeStubToNSString 1371 1370 -0.1% 1.00x
ClassArrayGetter 12 12 +0.0% 1.00x
Histogram 654 654 +0.0% 1.00x
SortStrings 1650 1650 +0.0% 1.00x
ObjectiveCBridgeFromNSDictionaryAnyObjectForced 4496 4508 +0.3% 1.00x(?)
MonteCarloPi 42554 42568 +0.0% 1.00x
StringWithCString 80988 81015 +0.0% 1.00x(?)
ObjectiveCBridgeFromNSArrayAnyObjectForced 3789 3794 +0.1% 1.00x(?)
ObjectiveCBridgeFromNSStringForced 2133 2141 +0.4% 1.00x(?)
SortLettersInPlace 1006 1001 -0.5% 1.00x
ArrayOfGenericPOD 208 208 +0.0% 1.00x
Dictionary3OfObjects 1246 1247 +0.1% 1.00x
SetUnion_OfObjects 10317 10284 -0.3% 1.00x(?)
RangeAssignment 278 278 +0.0% 1.00x
ByteSwap 1 1 +0.0% 1.00x
SuperChars 503214 503261 +0.0% 1.00x(?)
XorLoop 358 359 +0.3% 1.00x
StringInterpolation 9971 9940 -0.3% 1.00x(?)
Integrate 225 225 +0.0% 1.00x
ObjectiveCBridgeStubFromNSStringRef 327 327 +0.0% 1.00x
ObjectiveCBridgeStubFromNSString 704 705 +0.1% 1.00x(?)
ProtocolDispatch 2870 2871 +0.0% 1.00x(?)
TypeFlood 0 0 +0.0% 1.00x
ObjectiveCBridgeFromNSSetAnyObject 111691 112104 +0.4% 1.00x(?)
AngryPhonebook 0 0 +0.0% 1.00x
ProtocolDispatch2 151 151 +0.0% 1.00x
Walsh 309 309 +0.0% 1.00x
Dictionary3 741 743 +0.3% 1.00x(?)
Dictionary2 2357 2357 +0.0% 1.00x
Join 403 404 +0.2% 1.00x(?)
ObjectiveCBridgeToNSArray 29092 29175 +0.3% 1.00x(?)
DictionaryOfObjects 2766 2763 -0.1% 1.00x(?)
PopFrontUnsafePointer 8502 8502 +0.0% 1.00x
CaptureProp 4594 4596 +0.0% 1.00x(?)
PolymorphicCalls 61 61 +0.0% 1.00x
Calculator 34 34 +0.0% 1.00x
MapReduce 324 324 +0.0% 1.00x
DictionaryLiteral 3234 3248 +0.4% 1.00x(?)
Hanoi 3296 3289 -0.2% 1.00x(?)
OpenClose 48 48 +0.0% 1.00x
DictionaryRemoveOfObjects 22568 22552 -0.1% 1.00x(?)
UTF8Decode 268 268 +0.0% 1.00x
Dictionary 962 963 +0.1% 1.00x(?)
NopDeinit 34591 34602 +0.0% 1.00x(?)
ObjectiveCBridgeFromNSArrayAnyObject 61450 61506 +0.1% 1.00x(?)
SetIntersect 1305 1304 -0.1% 1.00x
SetExclusiveOr 3724 3719 -0.1% 1.00x(?)
RGBHistogramOfObjects 24075 24152 +0.3% 1.00x(?)
StrToInt 5225 5229 +0.1% 1.00x(?)
ObjectiveCBridgeFromNSString 1512 1516 +0.3% 1.00x(?)
Phonebook 10438 10443 +0.1% 1.00x(?)
Sim2DArray 401 401 +0.0% 1.00x
MonteCarloE 10022 10030 +0.1% 1.00x(?)
114 2550512 2556747 +0.2% 1.00x
GlobalClass 0 0 +0.0% 1.00x
HashTest 1770 1770 +0.0% 1.00x
SetIsSubsetOf_OfObjects 614 613 -0.2% 1.00x
ArrayAppend 730 729 -0.1% 1.00x(?)
LinkedList 8988 8986 -0.0% 1.00x(?)
ObjectiveCBridgeFromNSSetAnyObjectToStringForced 112227 112427 +0.2% 1.00x(?)
NSStringConversion 613 613 +0.0% 1.00x
RGBHistogram 3462 3455 -0.2% 1.00x(?)
ObjectiveCBridgeFromNSSetAnyObjectForced 4194 4203 +0.2% 1.00x(?)
ArrayValueProp4 5 5 +0.0% 1.00x
ArrayOfPOD 172 172 +0.0% 1.00x
SetUnion 3303 3312 +0.3% 1.00x(?)
Chars 655 657 +0.3% 1.00x
StringBuilder 1383 1383 +0.0% 1.00x
DeadArray 172 172 +0.0% 1.00x
BitCount 1 1 +0.0% 1.00x
ArrayLiteral 973 975 +0.2% 1.00x
SevenBoom 1285 1280 -0.4% 1.00x(?)
StringWalk 6341 6332 -0.1% 1.00x
ArrayValueProp 5 5 +0.0% 1.00x
RC4 268 268 +0.0% 1.00x
Memset 222 222 +0.0% 1.00x
Dictionary2OfObjects 3921 3914 -0.2% 1.00x(?)
ArrayAppendReserved 507 507 +0.0% 1.00x
TwoSum 1716 1708 -0.5% 1.00x(?)
ArrayValueProp2 5 5 +0.0% 1.00x
ArrayValueProp3 5 5 +0.0% 1.00x
ArraySubscript 1344 1354 +0.7% 0.99x(?)
ObjectiveCBridgeFromNSArrayAnyObjectToString 154587 155897 +0.8% 0.99x(?)
Prims 753 760 +0.9% 0.99x(?)
StaticArray 2691 2716 +0.9% 0.99x(?)
ArrayOfRef 3388 3423 +1.0% 0.99x
ObjectiveCBridgeToNSSet 15412 15578 +1.1% 0.99x(?)
ArrayOfGenericRef 3438 3478 +1.2% 0.99x
DictionarySwapOfObjects 7654 7824 +2.2% 0.98x(?)
ObjectiveCBridgeFromNSDictionaryAnyObjectToString 201586 205417 +1.9% 0.98x(?)
DictionarySwap 690 705 +2.2% 0.98x(?)
ObjectiveCBridgeStubToArrayOfNSString 28966 29570 +2.1% 0.98x
DictionaryRemove 4670 4747 +1.6% 0.98x(?)
ObjectiveCBridgeFromNSDictionaryAnyObjectToStringForced 126199 130876 +3.7% 0.96x
SetIsSubsetOf 476 495 +4.0% 0.96x
ObjectiveCBridgeFromNSArrayAnyObjectToStringForced 154618 160432 +3.8% 0.96x(?)
ArrayInClass 60 63 +5.0% 0.95x(?)
**Unoptimized (Onone)**

Regression (0)

Improvement (0)

No Changes (115)

TEST OLD_MIN NEW_MIN DELTA (%) SPEEDUP
ObjectiveCBridgeFromNSDictionaryAnyObjectToString 213259 208723 -2.1% 1.02x(?)
StaticArray 17139 16881 -1.5% 1.02x
DictionaryLiteral 20427 20043 -1.9% 1.02x(?)
ObjectiveCBridgeFromNSSetAnyObjectForced 7446 7291 -2.1% 1.02x
ObjectiveCBridgeToNSString 1047 1037 -1.0% 1.01x(?)
ObjectiveCBridgeFromNSArrayAnyObjectToString 156506 155519 -0.6% 1.01x(?)
ObjectiveCBridgeFromNSArrayAnyObjectForced 6997 6962 -0.5% 1.01x(?)
ObjectiveCBridgeFromNSStringForced 2541 2526 -0.6% 1.01x
ObjectiveCBridgeFromNSDictionaryAnyObject 231436 229280 -0.9% 1.01x(?)
SuperChars 679150 675129 -0.6% 1.01x(?)
ErrorHandling 7135 7035 -1.4% 1.01x(?)
ProtocolDispatch 4870 4839 -0.6% 1.01x
ObjectiveCBridgeFromNSSetAnyObject 118008 116992 -0.9% 1.01x(?)
DictionaryOfObjects 7085 6996 -1.3% 1.01x(?)
PolymorphicCalls 1112 1096 -1.4% 1.01x(?)
NopDeinit 56230 55938 -0.5% 1.01x
Phonebook 58493 58071 -0.7% 1.01x(?)
LinkedList 26401 26259 -0.5% 1.01x(?)
StringBuilder 8070 8016 -0.7% 1.01x(?)
BitCount 76 75 -1.3% 1.01x
ArraySubscript 4485 4488 +0.1% 1.00x(?)
DictionarySwapOfObjects 25760 25714 -0.2% 1.00x(?)
StackPromo 80372 80222 -0.2% 1.00x(?)
PopFrontArray 12187 12203 +0.1% 1.00x(?)
RecursiveOwnedParameter 10310 10330 +0.2% 1.00x(?)
ObjectiveCBridgeStubToNSString 1672 1668 -0.2% 1.00x(?)
ClassArrayGetter 1267 1265 -0.2% 1.00x(?)
Array2D 698552 698878 +0.1% 1.00x(?)
Histogram 13755 13799 +0.3% 1.00x(?)
SortStrings 5661 5667 +0.1% 1.00x(?)
DictionaryBridge 3808 3808 +0.0% 1.00x
ArrayOfGenericPOD 3236 3238 +0.1% 1.00x(?)
StringWithCString 533165 533260 +0.0% 1.00x(?)
Prims 13650 13660 +0.1% 1.00x(?)
SortLettersInPlace 2309 2305 -0.2% 1.00x
DictionarySwap 11725 11724 -0.0% 1.00x(?)
Dictionary3OfObjects 2729 2737 +0.3% 1.00x(?)
SetUnion_OfObjects 51322 51300 -0.0% 1.00x(?)
RangeAssignment 15703 15668 -0.2% 1.00x(?)
ByteSwap 9 9 +0.0% 1.00x
XorLoop 18447 18441 -0.0% 1.00x(?)
StringInterpolation 12652 12603 -0.4% 1.00x(?)
Integrate 341 341 +0.0% 1.00x
ObjectiveCBridgeStubFromNSStringRef 652 651 -0.1% 1.00x(?)
ObjectiveCBridgeStubFromNSString 1121 1122 +0.1% 1.00x(?)
ObjectAllocation 1295 1297 +0.1% 1.00x(?)
ArrayLiteral 1036 1036 +0.0% 1.00x
ProtocolDispatch2 416 416 +0.0% 1.00x
Walsh 12250 12234 -0.1% 1.00x(?)
Dictionary3 2094 2095 +0.1% 1.00x(?)
Dictionary2 5030 5029 -0.0% 1.00x(?)
StrComplexWalk 7573 7567 -0.1% 1.00x(?)
SetIntersect_OfObjects 18957 18953 -0.0% 1.00x(?)
Join 1332 1331 -0.1% 1.00x
ArrayOfRef 9923 9924 +0.0% 1.00x(?)
PopFrontArrayGeneric 12380 12403 +0.2% 1.00x(?)
CaptureProp 53358 53259 -0.2% 1.00x(?)
Calculator 906 906 +0.0% 1.00x
MapReduce 45089 44873 -0.5% 1.00x(?)
Hanoi 22635 22616 -0.1% 1.00x(?)
DictionaryRemoveOfObjects 61002 60942 -0.1% 1.00x(?)
UTF8Decode 39361 39324 -0.1% 1.00x(?)
SetIsSubsetOf 2977 2974 -0.1% 1.00x(?)
Dictionary 4417 4424 +0.2% 1.00x
ObjectiveCBridgeFromNSArrayAnyObject 65614 65404 -0.3% 1.00x(?)
SetIntersect 18888 18857 -0.2% 1.00x(?)
SetExclusiveOr 48711 48812 +0.2% 1.00x(?)
RGBHistogramOfObjects 97858 97610 -0.2% 1.00x(?)
StrToInt 18734 18705 -0.1% 1.00x(?)
ArrayInClass 3646 3648 +0.1% 1.00x(?)
ArrayOfGenericRef 10554 10575 +0.2% 1.00x(?)
ObjectiveCBridgeFromNSString 4864 4850 -0.3% 1.00x
Sim2DArray 13145 13141 -0.0% 1.00x
SetExclusiveOr_OfObjects 66999 66990 -0.0% 1.00x(?)
MonteCarloPi 50360 50364 +0.0% 1.00x(?)
MonteCarloE 98784 98789 +0.0% 1.00x(?)
114 5419340 5400253 -0.3% 1.00x
GlobalClass 0 0 +0.0% 1.00x
HashTest 5827 5827 +0.0% 1.00x
SetIsSubsetOf_OfObjects 2851 2852 +0.0% 1.00x(?)
ArrayAppend 2846 2847 +0.0% 1.00x(?)
DictionaryRemove 30381 30326 -0.2% 1.00x(?)
ObjectiveCBridgeFromNSSetAnyObjectToStringForced 121534 121539 +0.0% 1.00x(?)
NSStringConversion 2592 2582 -0.4% 1.00x(?)
RGBHistogram 49640 49808 +0.3% 1.00x(?)
ArrayValueProp4 2504 2505 +0.0% 1.00x(?)
ArrayOfPOD 2257 2257 +0.0% 1.00x
SetUnion 34938 34793 -0.4% 1.00x
Chars 54471 54507 +0.1% 1.00x(?)
AngryPhonebook 3502 3501 -0.0% 1.00x(?)
SevenBoom 1426 1430 +0.3% 1.00x(?)
ObjectiveCBridgeFromNSArrayAnyObjectToStringForced 156253 155803 -0.3% 1.00x(?)
StringWalk 48861 48856 -0.0% 1.00x(?)
ArrayValueProp 2206 2212 +0.3% 1.00x
RC4 8800 8802 +0.0% 1.00x(?)
Memset 20646 20649 +0.0% 1.00x(?)
Dictionary2OfObjects 6775 6762 -0.2% 1.00x(?)
ArrayAppendReserved 2615 2611 -0.1% 1.00x(?)
TwoSum 9228 9216 -0.1% 1.00x(?)
ArrayValueProp2 18285 18294 +0.1% 1.00x(?)
ArrayValueProp3 2546 2551 +0.2% 1.00x(?)
ObjectiveCBridgeToNSSet 16104 16338 +1.4% 0.99x(?)
ObjectiveCBridgeToNSArray 29436 29590 +0.5% 0.99x(?)
NSError 647 656 +1.4% 0.99x(?)
PopFrontUnsafePointer 93929 95357 +1.5% 0.99x(?)
OpenClose 434 438 +0.9% 0.99x(?)
ObjectiveCBridgeFromNSDictionaryAnyObjectToStringForced 130679 131547 +0.7% 0.99x(?)
NSDictionaryCastToSwift 11834 11907 +0.6% 0.99x(?)
ObjectiveCBridgeFromNSSetAnyObjectToString 197857 199806 +1.0% 0.99x(?)
DeadArray 113722 115389 +1.5% 0.99x(?)
ObjectiveCBridgeStubFromArrayOfNSString 107637 108472 +0.8% 0.99x(?)
TypeFlood 148 151 +2.0% 0.98x(?)
ObjectiveCBridgeStubToArrayOfNSString 29497 29958 +1.6% 0.98x(?)
ObjectiveCBridgeFromNSDictionaryAnyObjectForced 6991 7243 +3.6% 0.97x(?)
ObjectiveCBridgeToNSDictionary 15684 16202 +3.3% 0.97x(?)
**Hardware Overview** Model Name: Mac mini Model Identifier: Macmini7,1 Processor Name: Intel Core i7 Processor Speed: 3 GHz Number of Processors: 1 Total Number of Cores: 2 L2 Cache (per Core): 256 KB L3 Cache: 4 MB Memory: 16 GB

@jrose-apple
Copy link
Contributor Author

@swift-ci Please test Linux platform

jrose-apple added a commit to jrose-apple/swift-corelibs-foundation that referenced this pull request Apr 5, 2016
jrose-apple added a commit to jrose-apple/swift-corelibs-foundation that referenced this pull request Apr 5, 2016
jrose-apple added a commit to jrose-apple/swift-corelibs-foundation that referenced this pull request Apr 5, 2016
jrose-apple added a commit to jrose-apple/swift-corelibs-foundation that referenced this pull request Apr 5, 2016
jrose-apple added a commit to jrose-apple/swift-corelibs-foundation that referenced this pull request Apr 5, 2016
jrose-apple added a commit to jrose-apple/swift-package-manager that referenced this pull request Apr 7, 2016
jrose-apple added a commit to jrose-apple/swift-corelibs-foundation that referenced this pull request Apr 7, 2016
jrose-apple added a commit to jrose-apple/swift-package-manager that referenced this pull request Apr 11, 2016
@jrose-apple jrose-apple changed the title [WIP] SE-0055: Making pointer nullability explicit SE-0055: Making pointer nullability explicit Apr 12, 2016
@jrose-apple jrose-apple force-pushed the optional-pointers branch 2 times, most recently from 7fe3183 to 37e6b6f Compare April 12, 2016 00:59
emitPointerToPointer(mainClass, ManagedValue::forUnmanaged(argv),
argv->getType().getSwiftRValueType(),
unwrappedTy.getSwiftRValueType());
argv = converted.getUnmanagedSingleValue(*this, mainClass);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@slavapestov, here's the client code for the emitPointerToPointer change. Does this look right?

@jrose-apple
Copy link
Contributor Author

@swift-ci Please smoke test

(full testing will fail because it tries to build other repos too)

@jrose-apple
Copy link
Contributor Author

@swift-ci Please smoke test

Implements SE-0055: https://github.com/apple/swift-evolution/blob/master/proposals/0055-optional-unsafe-pointers.md

- Add NULL as an extra inhabitant of Builtin.RawPointer (currently
  hardcoded to 0 rather than being target-dependent).
- Import non-object pointers as Optional/IUO when nullable/null_unspecified
  (like everything else).
- Change the type checker's *-to-pointer conversions to handle a layer of
  optional.
- Use 'AutoreleasingUnsafeMutablePointer<NSError?>?' as the type of error
  parameters exported to Objective-C.
- Drop NilLiteralConvertible conformance for all pointer types.
- Update the standard library and then all the tests.

I've decided to leave this commit only updating existing tests; any new
tests will come in the following commits. (That may mean some additional
implementation work to follow.)

The other major piece that's missing here is migration. I'm hoping we get
a lot of that with Swift 1.1's work for optional object references, but
I still need to investigate.
This previously blew up if the Objective-C client passed NULL for the
error parameter, but started working after the pointer nullability
change. Why? John had /already written and committed/ code to handle
NULL assuming pointer nullability was explicit, and that code was
/correct as is/.
Some inner pointers are explicitly annotated as _Nonnull, and we
should believe that. This is important when passing, say, pointers
to arrays.
@jrose-apple jrose-apple merged commit 9cdbec1 into swiftlang:master Apr 12, 2016
jrose-apple added a commit to swiftlang/swift-package-manager that referenced this pull request Apr 12, 2016
Update for SE-0055: Making pointer nullability explicit. See swiftlang/swift#1878.
jrose-apple added a commit to jrose-apple/swift-lldb that referenced this pull request Apr 12, 2016
@jrose-apple jrose-apple deleted the optional-pointers branch April 13, 2016 02:14
MaxDesiatov added a commit that referenced this pull request Oct 19, 2020
…gs-again

Disable assertion for both target and host toolchain
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants