> On May 12, 2017, at 2:34 PM, Will Stanton <willstant...@yahoo.com> wrote:
> 
> I am a bit curious about Pushkar’s test case; perhaps it should be added as a 
> test?
> 
> The SIL emitted then vs ~today looked very similar, so I was thinking the 
> issue might be in IRGen.
> Scanning there, looks like this cured the problem:
> @shajrawi https://github.com/apple/swift/pull/9452 Disable large types irgen 
> pass
> 
> The property change happens when the pass is disabled, but before 
> f9861fe6fcd9d797653f62a0b0c4142e719eecf1, the change does not happen:
> before => ready(test.TState(drain: test.Drain.foo("wow")))
> after => ready(test.TState(drain: test.Drain.foo("wow")))
> 
> The `newValue` access in willSet apparently ‘alters’ it to the old value.
> https://bugs.swift.org/browse/SR-4852

Yes, the pass was disabled because it was causing miscompiles like this.

John.

> 
> Regards,
> Will Stanton
> 
>> On May 10, 2017, at 1:08 PM, John McCall via swift-dev <swift-dev@swift.org> 
>> wrote:
>> 
>>> On May 10, 2017, at 11:06 AM, Pushkar N Kulkarni <pushkar...@in.ibm.com> 
>>> wrote:
>>> The issue is seen with the 05-09 dev snapshot. However after updating the 
>>> repos today, I no longer see it! 
>>> 
>>> Looks like one of yesterday's commits (which did not go into 05-09)  fixed 
>>> it. I am closing the JIRA report. Thanks!
>> 
>> Okay, glad we managed to fix it; thanks.
>> 
>> John.
>> 
>>> 
>>> Pushkar N Kulkarni,
>>> IBM Runtimes
>>> 
>>> Simplicity is prerequisite for reliability - Edsger W. Dijkstra
>>> 
>>> 
>>> 
>>> -----swift-dev-boun...@swift.org wrote: -----
>>> To: John McCall <rjmcc...@apple.com>
>>> From: Pushkar N Kulkarni via swift-dev 
>>> Sent by: swift-dev-boun...@swift.org
>>> Date: 05/10/2017 06:00PM
>>> Cc: swift-dev <swift-dev@swift.org>
>>> Subject: Re: [swift-dev] Property modification not taking effect
>>> 
>>> Thanks John. This is the JIRA bug report: 
>>> https://bugs.swift.org/browse/SR-4852
>>> 
>>> I was able to write a small test case that shows the regression:
>>> 
>>> enum State {
>>>    case ready(TState)
>>>    case inProgress(TState)
>>> 
>>>    var isPaused: Bool {
>>>        switch self {
>>>        case .ready: return false
>>>        case .inProgress: return false
>>>        }
>>>    }
>>> }
>>> 
>>> enum Drain {
>>>    case foo(String)
>>>    case bar(Int, String)
>>> }
>>> 
>>> struct TState {
>>>    let drain: Drain
>>> }
>>> 
>>> class Task {
>>>    var state = State.ready(TState(drain: .foo("wow"))) { 
>>>        willSet {
>>>            if newValue.isPaused { }
>>>        }
>>>    }
>>> 
>>>    func resume() {
>>>        if case .ready(let tState) = state {
>>>            print("before => \(state)")
>>>            state = .inProgress(tState) //doesn't take effect
>>>            print("after => \(state)")
>>>        }
>>>    }
>>> }    
>>> 
>>> //main
>>> Task().resume()
>>> 
>>> Output with the latest master:
>>> before => ready(Test.TState(drain: Test.Drain.foo("wow")))
>>> after => ready(Test.TState(drain: Test.Drain.foo("wow")))
>>> 
>>> 
>>> Expected output (and with the 04-24 snapshot as well):
>>> before => ready(Test.TState(drain: Test.Drain.foo("wow")))
>>> after => inProgress(Test.TState(drain: Test.Drain.foo("wow")))
>>> 
>>> 
>>> Pushkar N Kulkarni,
>>> IBM Runtimes
>>> 
>>> Simplicity is prerequisite for reliability - Edsger W. Dijkstra
>>> 
>>> 
>>> 
>>> -----rjmcc...@apple.com wrote: -----
>>> To: Pushkar N Kulkarni <pushkar...@in.ibm.com>
>>> From: John McCall 
>>> Sent by: rjmcc...@apple.com
>>> Date: 05/10/2017 04:19AM
>>> Cc: swift-dev <swift-dev@swift.org>
>>> Subject: Re: [swift-dev] Property modification not taking effect
>>> 
>>>> On May 9, 2017, at 3:07 PM, Pushkar N Kulkarni via swift-dev 
>>>> <swift-dev@swift.org> wrote:
>>>> In the process of debugging a bunch of consistent failures in 
>>>> TestFoundation/TestNSURLSession, I came across a weird problem symptom in 
>>>> this line of code.
>>>> 
>>>> internalState = .transferInProgress(transferState)
>>>> 
>>>> I had a suspicion that the above modification is not taking effect, since, 
>>>> only based on this change the didSet observer for the `internalState` 
>>>> property triggers data transfers using libcurl. So, I simply printed the 
>>>> property before and after the assignment. 
>>>> 
>>>> print("before => \(internalState)")
>>>> internalState = .transferInProgress(transferState)
>>>> print("after => \(internalState)")
>>>> 
>>>> Surprisingly, I don't see any change in the property value:
>>>> before => transferReady(Foundation.URLSessionTask._TransferState(... 
>>>> <redacted> ...))
>>>> after  => transferReady(Foundation.URLSessionTask._TransferState(... 
>>>> <redacted> ...))
>>>> 
>>>> When I switched back to the "swift-DEVELOPMENT-SNAPSHOT-2017-04-24-a" tag 
>>>> on all the repos (except swift-corelibs-foundation), I do not see this 
>>>> problem. I see:
>>>> before => transferReady(Foundation.URLSessionTask._TransferState(... 
>>>> <redacted> ...))
>>>> after  => transferInProgress(Foundation.URLSessionTask._TransferState(... 
>>>> <redacted> ...))
>>>> 
>>>> To put it in simple terms, the modification doesn't seem to be taking 
>>>> effect with the current HEAD. 
>>>> 
>>>> I haven't been able to isolate this problem in an independent test case. 
>>>> However, anybody who wants to reproduce it can simply run TestFoundation 
>>>> after enabling the URLSession tests (which have been disabled for now) in 
>>>> TestFoundation/main.swift. 
>>>> 
>>>> I did compare the `-emit-ir` outputs from the passing and failing levels. 
>>>> There seems to be a clear difference in the way we store the new value of 
>>>> this property. But given my limited exposure to debugging Swift compiler 
>>>> issues, I wasn't able to progress further.  
>>>> 
>>>> Can someone help us here please? Thanks. 
>>> 
>>> That sounds like a serious bug; please file it in JIRA.
>>> 
>>> John.
> 
> 

_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to