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

[SR-5965] Unexpected type-mismatch errors when parsing JSON in Release configuration #48524

Closed
jlukas opened this issue Sep 22, 2017 · 15 comments
Assignees
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler in itself

Comments

@jlukas
Copy link

jlukas commented Sep 22, 2017

Previous ID SR-5965
Radar rdar://problem/34595788
Original Reporter @jlukas
Type Bug
Status Resolved
Resolution Done

Attachment: Download

Additional Detail from JIRA
Votes 1
Component/s Compiler
Labels Bug
Assignee @itaiferber
Priority Medium

md5: c553627b0afde986617903f9c0db977c

relates to:

  • SR-5960 Decoding a struct with a RawRepresentable field fails when whole module optimization is enabled
  • SR-7817 RawRepresentable decodable encodable inits not work on release

Issue Description:

I have a Codable struct which doesn't parse correctly in Release configuration. There appear to be a few requirements to hit this case, so I've attached an Xcode project (reduced as much as possible).

Notes:

  • This only happens in Release configuration – works fine in Debug

  • The order of the source files is relevant – changing the order can work around the problem

@belkadan
Copy link
Contributor

Likely the release/non-release part is really WMO/non-WMO. Thanks for the report!

@belkadan
Copy link
Contributor

cc @itaiferber

@belkadan
Copy link
Contributor

@swift-ci create

@itaiferber
Copy link
Contributor

This is definitely related to whole-module optimization — turning it on causes the failure.

Specifically, this seems to have to do with the fact that Model.Friend is declared in an extension:

// Model.swift
enum Model {}

// Friend.swift
extension Model {
    struct Friend : Decodable { ... }
}

Declaring Friend directly in Model works when whole-module optimization is enabled:

// Model.swift
enum Model {
    struct Friend : Decodable { ... }
}

Going to investigate this.

@itaiferber
Copy link
Contributor

This might have to do with the codegen that the compiler does for Codable when optimization is enabled.

@itaiferber
Copy link
Contributor

I'm not sure how much of this has to do with Codable specifically, but this definitely has to do with the order of file compilation — if Parse.swift is compiled before Friend.swift, this error occurs. I noticed that when WMO is on, compilation order appeared to matter, so I wrote a small script to test all file order combinations:

#! /usr/bin/env python3

from itertools import permutations
import subprocess

def attempt_compilation(args):
    sdk_path = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"
    arguments = ["xcrun", "swiftc", "-sdk", sdk_path, "-o", "main", "-O", "-whole-module-optimization"]
    arguments.extend(args)

    # Throws an exception if compilation fails.
    subprocess.run(arguments, check=True, stdout=subprocess.DEVNULL)

    # A 0 return statussuccess
    success = subprocess.run("./main", stdout=subprocess.PIPE, encoding='UTF-8').stdout.strip() == "true"
    subprocess.run(["rm", "./main"], stdout=subprocess.DEVNULL)
    return success

if __name__=="__main__":
    files = ["main.swift", "Parse.swift", "Model.swift", "Friend.swift", "Identifier.swift"]
    for iteration in permutations(files):
        args = list(iteration)
        try:
            message = "SUCCESS:" if attempt_compilation(args) else "FAILURE:"
            print(message, args)
        except subprocess.SubprocessError:
            print("COMPILATION FAILURE:", args)

The results were an even 50-50 split (the results here are sorted):

FAILURE: ['Identifier.swift', 'main.swift', 'Model.swift', 'Parse.swift', 'Friend.swift']
FAILURE: ['Identifier.swift', 'main.swift', 'Parse.swift', 'Friend.swift', 'Model.swift']
FAILURE: ['Identifier.swift', 'main.swift', 'Parse.swift', 'Model.swift', 'Friend.swift']
FAILURE: ['Identifier.swift', 'Model.swift', 'main.swift', 'Parse.swift', 'Friend.swift']
FAILURE: ['Identifier.swift', 'Model.swift', 'Parse.swift', 'Friend.swift', 'main.swift']
FAILURE: ['Identifier.swift', 'Model.swift', 'Parse.swift', 'main.swift', 'Friend.swift']
FAILURE: ['Identifier.swift', 'Parse.swift', 'Friend.swift', 'main.swift', 'Model.swift']
FAILURE: ['Identifier.swift', 'Parse.swift', 'Friend.swift', 'Model.swift', 'main.swift']
FAILURE: ['Identifier.swift', 'Parse.swift', 'main.swift', 'Friend.swift', 'Model.swift']
FAILURE: ['Identifier.swift', 'Parse.swift', 'main.swift', 'Model.swift', 'Friend.swift']
FAILURE: ['Identifier.swift', 'Parse.swift', 'Model.swift', 'Friend.swift', 'main.swift']
FAILURE: ['Identifier.swift', 'Parse.swift', 'Model.swift', 'main.swift', 'Friend.swift']
FAILURE: ['main.swift', 'Identifier.swift', 'Model.swift', 'Parse.swift', 'Friend.swift']
FAILURE: ['main.swift', 'Identifier.swift', 'Parse.swift', 'Friend.swift', 'Model.swift']
FAILURE: ['main.swift', 'Identifier.swift', 'Parse.swift', 'Model.swift', 'Friend.swift']
FAILURE: ['main.swift', 'Model.swift', 'Identifier.swift', 'Parse.swift', 'Friend.swift']
FAILURE: ['main.swift', 'Model.swift', 'Parse.swift', 'Friend.swift', 'Identifier.swift']
FAILURE: ['main.swift', 'Model.swift', 'Parse.swift', 'Identifier.swift', 'Friend.swift']
FAILURE: ['main.swift', 'Parse.swift', 'Friend.swift', 'Identifier.swift', 'Model.swift']
FAILURE: ['main.swift', 'Parse.swift', 'Friend.swift', 'Model.swift', 'Identifier.swift']
FAILURE: ['main.swift', 'Parse.swift', 'Identifier.swift', 'Friend.swift', 'Model.swift']
FAILURE: ['main.swift', 'Parse.swift', 'Identifier.swift', 'Model.swift', 'Friend.swift']
FAILURE: ['main.swift', 'Parse.swift', 'Model.swift', 'Friend.swift', 'Identifier.swift']
FAILURE: ['main.swift', 'Parse.swift', 'Model.swift', 'Identifier.swift', 'Friend.swift']
FAILURE: ['Model.swift', 'Identifier.swift', 'main.swift', 'Parse.swift', 'Friend.swift']
FAILURE: ['Model.swift', 'Identifier.swift', 'Parse.swift', 'Friend.swift', 'main.swift']
FAILURE: ['Model.swift', 'Identifier.swift', 'Parse.swift', 'main.swift', 'Friend.swift']
FAILURE: ['Model.swift', 'main.swift', 'Identifier.swift', 'Parse.swift', 'Friend.swift']
FAILURE: ['Model.swift', 'main.swift', 'Parse.swift', 'Friend.swift', 'Identifier.swift']
FAILURE: ['Model.swift', 'main.swift', 'Parse.swift', 'Identifier.swift', 'Friend.swift']
FAILURE: ['Model.swift', 'Parse.swift', 'Friend.swift', 'Identifier.swift', 'main.swift']
FAILURE: ['Model.swift', 'Parse.swift', 'Friend.swift', 'main.swift', 'Identifier.swift']
FAILURE: ['Model.swift', 'Parse.swift', 'Identifier.swift', 'Friend.swift', 'main.swift']
FAILURE: ['Model.swift', 'Parse.swift', 'Identifier.swift', 'main.swift', 'Friend.swift']
FAILURE: ['Model.swift', 'Parse.swift', 'main.swift', 'Friend.swift', 'Identifier.swift']
FAILURE: ['Model.swift', 'Parse.swift', 'main.swift', 'Identifier.swift', 'Friend.swift']
FAILURE: ['Parse.swift', 'Friend.swift', 'Identifier.swift', 'main.swift', 'Model.swift']
FAILURE: ['Parse.swift', 'Friend.swift', 'Identifier.swift', 'Model.swift', 'main.swift']
FAILURE: ['Parse.swift', 'Friend.swift', 'main.swift', 'Identifier.swift', 'Model.swift']
FAILURE: ['Parse.swift', 'Friend.swift', 'main.swift', 'Model.swift', 'Identifier.swift']
FAILURE: ['Parse.swift', 'Friend.swift', 'Model.swift', 'Identifier.swift', 'main.swift']
FAILURE: ['Parse.swift', 'Friend.swift', 'Model.swift', 'main.swift', 'Identifier.swift']
FAILURE: ['Parse.swift', 'Identifier.swift', 'Friend.swift', 'main.swift', 'Model.swift']
FAILURE: ['Parse.swift', 'Identifier.swift', 'Friend.swift', 'Model.swift', 'main.swift']
FAILURE: ['Parse.swift', 'Identifier.swift', 'main.swift', 'Friend.swift', 'Model.swift']
FAILURE: ['Parse.swift', 'Identifier.swift', 'main.swift', 'Model.swift', 'Friend.swift']
FAILURE: ['Parse.swift', 'Identifier.swift', 'Model.swift', 'Friend.swift', 'main.swift']
FAILURE: ['Parse.swift', 'Identifier.swift', 'Model.swift', 'main.swift', 'Friend.swift']
FAILURE: ['Parse.swift', 'main.swift', 'Friend.swift', 'Identifier.swift', 'Model.swift']
FAILURE: ['Parse.swift', 'main.swift', 'Friend.swift', 'Model.swift', 'Identifier.swift']
FAILURE: ['Parse.swift', 'main.swift', 'Identifier.swift', 'Friend.swift', 'Model.swift']
FAILURE: ['Parse.swift', 'main.swift', 'Identifier.swift', 'Model.swift', 'Friend.swift']
FAILURE: ['Parse.swift', 'main.swift', 'Model.swift', 'Friend.swift', 'Identifier.swift']
FAILURE: ['Parse.swift', 'main.swift', 'Model.swift', 'Identifier.swift', 'Friend.swift']
FAILURE: ['Parse.swift', 'Model.swift', 'Friend.swift', 'Identifier.swift', 'main.swift']
FAILURE: ['Parse.swift', 'Model.swift', 'Friend.swift', 'main.swift', 'Identifier.swift']
FAILURE: ['Parse.swift', 'Model.swift', 'Identifier.swift', 'Friend.swift', 'main.swift']
FAILURE: ['Parse.swift', 'Model.swift', 'Identifier.swift', 'main.swift', 'Friend.swift']
FAILURE: ['Parse.swift', 'Model.swift', 'main.swift', 'Friend.swift', 'Identifier.swift']
FAILURE: ['Parse.swift', 'Model.swift', 'main.swift', 'Identifier.swift', 'Friend.swift']

SUCCESS: ['Friend.swift', 'Identifier.swift', 'main.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'main.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'Model.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'Model.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'Parse.swift', 'main.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'Parse.swift', 'Model.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Identifier.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Identifier.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Model.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Model.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Parse.swift', 'Identifier.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Parse.swift', 'Model.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'Identifier.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'Identifier.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'main.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'main.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'Parse.swift', 'Identifier.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'Parse.swift', 'main.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'Identifier.swift', 'main.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'Identifier.swift', 'Model.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'main.swift', 'Identifier.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'main.swift', 'Model.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'Model.swift', 'Identifier.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'Model.swift', 'main.swift', 'Identifier.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'main.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'main.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'Model.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'Model.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'Parse.swift', 'main.swift', 'Model.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'Parse.swift', 'Model.swift', 'main.swift']
SUCCESS: ['Identifier.swift', 'main.swift', 'Friend.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'main.swift', 'Friend.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['Identifier.swift', 'main.swift', 'Model.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'Model.swift', 'Friend.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'Model.swift', 'Friend.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Identifier.swift', 'Model.swift', 'main.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Identifier.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Identifier.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Model.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Model.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Parse.swift', 'Identifier.swift', 'Model.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Parse.swift', 'Model.swift', 'Identifier.swift']
SUCCESS: ['main.swift', 'Identifier.swift', 'Friend.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Identifier.swift', 'Friend.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['main.swift', 'Identifier.swift', 'Model.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Model.swift', 'Friend.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Model.swift', 'Friend.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['main.swift', 'Model.swift', 'Identifier.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'Identifier.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'Identifier.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'main.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'main.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'Parse.swift', 'Identifier.swift', 'main.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'Parse.swift', 'main.swift', 'Identifier.swift']
SUCCESS: ['Model.swift', 'Identifier.swift', 'Friend.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'Identifier.swift', 'Friend.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Model.swift', 'Identifier.swift', 'main.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'main.swift', 'Friend.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'main.swift', 'Friend.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['Model.swift', 'main.swift', 'Identifier.swift', 'Friend.swift', 'Parse.swift']

Any time where Parse.swift compiled before Friend.swift, this error reproduced. If parse() compiles before the extension that declares Model.Friend, we get this error. I'll look into this further.

@belkadan This is similar to what I saw with PR #11735; if it's related, we might need to revisit that...

@belkadan
Copy link
Contributor

I mean, SR-631 is still a thing, but Codable should never get in that situation. (That one happens because we haven't resolved what an extension refers to, but that shouldn't be an issue here.)

@itaiferber
Copy link
Contributor

This is actually a bit more interesting. This might be related to SR-631, it might not.

The code works and is expected to work in the first place because the standard library offers the following extension (in stdlib/public/core/Codable.swift):

public extension RawRepresentable where RawValue == String, Self : Decodable {
    public init(from decoder: Decoder) throws {
      let decoded = try decoder.singleValueContainer().decode(RawValue.self)
      guard let value = Self(rawValue: decoded) else {
          throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: decoder.codingPath, debugDescription: "Cannot initialize \(Self.self) from invalid \(RawValue.self) value \(decoded)"))
      }

      self = value
    }
}

ID's Decodable implementation should be provided by this extension; after some testing, it appears that when WMO is enabled, this extension isn't seen (or is optimized away), and the synthesized implementation takes over. When WMO is disabled, ID successfully decodes from a string; when it is enabled, it attempts to decode from a keyed container and (correctly) fails.

This appears to be the exact same thing that is happening in SR-5960. @belkadan Thoughts on why this might be?

@belkadan
Copy link
Contributor

That doesn't sound like SR-631, which is only about name resolution. Maybe when WMO is on, we try to resolve the conformance to Decodable before we've proven that the RawValue is String? That doesn't really make sense to me, though. @DougGregor, any ideas?

@ffried
Copy link
Contributor

ffried commented Mar 29, 2018

Any news on this? We just hit the same problem in a released app.

@belkadan
Copy link
Contributor

Nothing really. :-( The results above suggest that Friend.swift must appear before Parse.swift to get the correct behavior, so you could possibly reorder your source files in the "Compile Sources" build phase to get it to work.

@ffried
Copy link
Contributor

ffried commented Mar 29, 2018

Yea, we successfully applied that workaround, too.
What makes this issues worse than SR-631 (in case they're related) is that while SR-631 fails at compile time, this one fails at runtime making it hard to detect. Since Unit Tests are also run against debug builds, even tests can't really detect this.

Has anyone tried this with Swift 4.1 (or 5)?

@itaiferber
Copy link
Contributor

I can no longer reproduce this with Swift 4.2, either in Xcode or with my script above:

SUCCESS: ['main.swift', 'Parse.swift', 'Model.swift', 'Friend.swift', 'Identifier.swift']
SUCCESS: ['main.swift', 'Parse.swift', 'Model.swift', 'Identifier.swift', 'Friend.swift']
SUCCESS: ['main.swift', 'Parse.swift', 'Friend.swift', 'Model.swift', 'Identifier.swift']
SUCCESS: ['main.swift', 'Parse.swift', 'Friend.swift', 'Identifier.swift', 'Model.swift']
SUCCESS: ['main.swift', 'Parse.swift', 'Identifier.swift', 'Model.swift', 'Friend.swift']
SUCCESS: ['main.swift', 'Parse.swift', 'Identifier.swift', 'Friend.swift', 'Model.swift']
SUCCESS: ['main.swift', 'Model.swift', 'Parse.swift', 'Friend.swift', 'Identifier.swift']
SUCCESS: ['main.swift', 'Model.swift', 'Parse.swift', 'Identifier.swift', 'Friend.swift']
SUCCESS: ['main.swift', 'Model.swift', 'Friend.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['main.swift', 'Model.swift', 'Friend.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Model.swift', 'Identifier.swift', 'Parse.swift', 'Friend.swift']
SUCCESS: ['main.swift', 'Model.swift', 'Identifier.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Parse.swift', 'Model.swift', 'Identifier.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Parse.swift', 'Identifier.swift', 'Model.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Model.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Model.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Identifier.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['main.swift', 'Friend.swift', 'Identifier.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Identifier.swift', 'Parse.swift', 'Model.swift', 'Friend.swift']
SUCCESS: ['main.swift', 'Identifier.swift', 'Parse.swift', 'Friend.swift', 'Model.swift']
SUCCESS: ['main.swift', 'Identifier.swift', 'Model.swift', 'Parse.swift', 'Friend.swift']
SUCCESS: ['main.swift', 'Identifier.swift', 'Model.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['main.swift', 'Identifier.swift', 'Friend.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['main.swift', 'Identifier.swift', 'Friend.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['Parse.swift', 'main.swift', 'Model.swift', 'Friend.swift', 'Identifier.swift']
SUCCESS: ['Parse.swift', 'main.swift', 'Model.swift', 'Identifier.swift', 'Friend.swift']
SUCCESS: ['Parse.swift', 'main.swift', 'Friend.swift', 'Model.swift', 'Identifier.swift']
SUCCESS: ['Parse.swift', 'main.swift', 'Friend.swift', 'Identifier.swift', 'Model.swift']
SUCCESS: ['Parse.swift', 'main.swift', 'Identifier.swift', 'Model.swift', 'Friend.swift']
SUCCESS: ['Parse.swift', 'main.swift', 'Identifier.swift', 'Friend.swift', 'Model.swift']
SUCCESS: ['Parse.swift', 'Model.swift', 'main.swift', 'Friend.swift', 'Identifier.swift']
SUCCESS: ['Parse.swift', 'Model.swift', 'main.swift', 'Identifier.swift', 'Friend.swift']
SUCCESS: ['Parse.swift', 'Model.swift', 'Friend.swift', 'main.swift', 'Identifier.swift']
SUCCESS: ['Parse.swift', 'Model.swift', 'Friend.swift', 'Identifier.swift', 'main.swift']
SUCCESS: ['Parse.swift', 'Model.swift', 'Identifier.swift', 'main.swift', 'Friend.swift']
SUCCESS: ['Parse.swift', 'Model.swift', 'Identifier.swift', 'Friend.swift', 'main.swift']
SUCCESS: ['Parse.swift', 'Friend.swift', 'main.swift', 'Model.swift', 'Identifier.swift']
SUCCESS: ['Parse.swift', 'Friend.swift', 'main.swift', 'Identifier.swift', 'Model.swift']
SUCCESS: ['Parse.swift', 'Friend.swift', 'Model.swift', 'main.swift', 'Identifier.swift']
SUCCESS: ['Parse.swift', 'Friend.swift', 'Model.swift', 'Identifier.swift', 'main.swift']
SUCCESS: ['Parse.swift', 'Friend.swift', 'Identifier.swift', 'main.swift', 'Model.swift']
SUCCESS: ['Parse.swift', 'Friend.swift', 'Identifier.swift', 'Model.swift', 'main.swift']
SUCCESS: ['Parse.swift', 'Identifier.swift', 'main.swift', 'Model.swift', 'Friend.swift']
SUCCESS: ['Parse.swift', 'Identifier.swift', 'main.swift', 'Friend.swift', 'Model.swift']
SUCCESS: ['Parse.swift', 'Identifier.swift', 'Model.swift', 'main.swift', 'Friend.swift']
SUCCESS: ['Parse.swift', 'Identifier.swift', 'Model.swift', 'Friend.swift', 'main.swift']
SUCCESS: ['Parse.swift', 'Identifier.swift', 'Friend.swift', 'main.swift', 'Model.swift']
SUCCESS: ['Parse.swift', 'Identifier.swift', 'Friend.swift', 'Model.swift', 'main.swift']
SUCCESS: ['Model.swift', 'main.swift', 'Parse.swift', 'Friend.swift', 'Identifier.swift']
SUCCESS: ['Model.swift', 'main.swift', 'Parse.swift', 'Identifier.swift', 'Friend.swift']
SUCCESS: ['Model.swift', 'main.swift', 'Friend.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['Model.swift', 'main.swift', 'Friend.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'main.swift', 'Identifier.swift', 'Parse.swift', 'Friend.swift']
SUCCESS: ['Model.swift', 'main.swift', 'Identifier.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'Parse.swift', 'main.swift', 'Friend.swift', 'Identifier.swift']
SUCCESS: ['Model.swift', 'Parse.swift', 'main.swift', 'Identifier.swift', 'Friend.swift']
SUCCESS: ['Model.swift', 'Parse.swift', 'Friend.swift', 'main.swift', 'Identifier.swift']
SUCCESS: ['Model.swift', 'Parse.swift', 'Friend.swift', 'Identifier.swift', 'main.swift']
SUCCESS: ['Model.swift', 'Parse.swift', 'Identifier.swift', 'main.swift', 'Friend.swift']
SUCCESS: ['Model.swift', 'Parse.swift', 'Identifier.swift', 'Friend.swift', 'main.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'main.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'main.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'Parse.swift', 'main.swift', 'Identifier.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'Parse.swift', 'Identifier.swift', 'main.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'Identifier.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'Friend.swift', 'Identifier.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Model.swift', 'Identifier.swift', 'main.swift', 'Parse.swift', 'Friend.swift']
SUCCESS: ['Model.swift', 'Identifier.swift', 'main.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'Identifier.swift', 'Parse.swift', 'main.swift', 'Friend.swift']
SUCCESS: ['Model.swift', 'Identifier.swift', 'Parse.swift', 'Friend.swift', 'main.swift']
SUCCESS: ['Model.swift', 'Identifier.swift', 'Friend.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Model.swift', 'Identifier.swift', 'Friend.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Parse.swift', 'Model.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Parse.swift', 'Identifier.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Model.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Model.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Identifier.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'main.swift', 'Identifier.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'main.swift', 'Model.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'main.swift', 'Identifier.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'Model.swift', 'main.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'Model.swift', 'Identifier.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'Identifier.swift', 'main.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'Parse.swift', 'Identifier.swift', 'Model.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'main.swift', 'Parse.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'main.swift', 'Identifier.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'Parse.swift', 'main.swift', 'Identifier.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'Parse.swift', 'Identifier.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'Identifier.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'Model.swift', 'Identifier.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'main.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'main.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'Parse.swift', 'main.swift', 'Model.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'Parse.swift', 'Model.swift', 'main.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'Model.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Friend.swift', 'Identifier.swift', 'Model.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Identifier.swift', 'main.swift', 'Parse.swift', 'Model.swift', 'Friend.swift']
SUCCESS: ['Identifier.swift', 'main.swift', 'Parse.swift', 'Friend.swift', 'Model.swift']
SUCCESS: ['Identifier.swift', 'main.swift', 'Model.swift', 'Parse.swift', 'Friend.swift']
SUCCESS: ['Identifier.swift', 'main.swift', 'Model.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'main.swift', 'Friend.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['Identifier.swift', 'main.swift', 'Friend.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'Parse.swift', 'main.swift', 'Model.swift', 'Friend.swift']
SUCCESS: ['Identifier.swift', 'Parse.swift', 'main.swift', 'Friend.swift', 'Model.swift']
SUCCESS: ['Identifier.swift', 'Parse.swift', 'Model.swift', 'main.swift', 'Friend.swift']
SUCCESS: ['Identifier.swift', 'Parse.swift', 'Model.swift', 'Friend.swift', 'main.swift']
SUCCESS: ['Identifier.swift', 'Parse.swift', 'Friend.swift', 'main.swift', 'Model.swift']
SUCCESS: ['Identifier.swift', 'Parse.swift', 'Friend.swift', 'Model.swift', 'main.swift']
SUCCESS: ['Identifier.swift', 'Model.swift', 'main.swift', 'Parse.swift', 'Friend.swift']
SUCCESS: ['Identifier.swift', 'Model.swift', 'main.swift', 'Friend.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'Model.swift', 'Parse.swift', 'main.swift', 'Friend.swift']
SUCCESS: ['Identifier.swift', 'Model.swift', 'Parse.swift', 'Friend.swift', 'main.swift']
SUCCESS: ['Identifier.swift', 'Model.swift', 'Friend.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'Model.swift', 'Friend.swift', 'Parse.swift', 'main.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'main.swift', 'Parse.swift', 'Model.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'main.swift', 'Model.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'Parse.swift', 'main.swift', 'Model.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'Parse.swift', 'Model.swift', 'main.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'Model.swift', 'main.swift', 'Parse.swift']
SUCCESS: ['Identifier.swift', 'Friend.swift', 'Model.swift', 'Parse.swift', 'main.swift']

@ffried, @jlukas, can you confirm whether you still see this with a recent Xcode 10 beta?

@ffried
Copy link
Contributor

ffried commented Sep 8, 2018

Yep. Looks good here, too. Thanks! So it really was SR-631 then?

@itaiferber
Copy link
Contributor

@ffried I'm not entirely sure, to be honest, but it seems likely. No Codable changes were needed here — this fell out of a change elsewhere.

@swift-ci swift-ci transferred this issue from apple/swift-issues Apr 25, 2022
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler in itself
Projects
None yet
Development

No branches or pull requests

4 participants