Skip to content

Instantly share code, notes, and snippets.

@elm4ward
Last active August 8, 2016 10:45
Show Gist options
  • Select an option

  • Save elm4ward/44f35aaac3cd54dc1c52302380ce56ea to your computer and use it in GitHub Desktop.

Select an option

Save elm4ward/44f35aaac3cd54dc1c52302380ce56ea to your computer and use it in GitHub Desktop.
Seg Fault

Segmentation Fault When Importing Module And Using Generic Typealias

TOC

Precondition

In the main module there are 4 generic Typealiases defined:

// FRAMEWORK

public typealias PalauDefaultsEntry<T: PalauDefaultable> = PalauEntry<PalauOptional<PalauSingle<T>>>
public typealias PalauDefaultsEntryEnsured<T: PalauDefaultable> = PalauEntry<PalauEnsured<PalauSingle<T>>>
public typealias PalauDefaultsArrayEntry<T: PalauDefaultable> = PalauEntry<PalauOptional<PalauList<T>>>
public typealias PalauDefaultsArrayEntryEnsured<T: PalauDefaultable> = PalauEntry<PalauEnsured<PalauList<T>>>

Using them in them in the module where they are defined works perfectly:

// FRAMEWORK

// first one defined public in order to test outside of module
public let p1: PalauDefaultsEntry<Bool> = PalauDefaults.value("")
let p2: PalauDefaultsEntryEnsured<Bool> = PalauDefaults.value("", whenNil: true)
let p3: PalauDefaultsArrayEntry<Bool> = PalauDefaults.value("")
let p4: PalauDefaultsArrayEntryEnsured<Bool> = PalauDefaults.value("", whenNil: [true])

The PalauEntry looks pretty straight forward:

// FRAMEWORK

public struct PalauEntry<Strategy>: PalauEntryBase
  where
  Strategy: PalauStrategy,
  Strategy.QuantifierType.DefaultableType: PalauDefaultable {

  public typealias EntryType = Strategy.ReturnType
  public typealias EnsureFunction = (EntryType) -> EntryType
  public typealias DidSetFunction = (EntryType, EntryType) -> ()

  public let key: String
  public let strategy: Strategy
  public let defaults: NSUD

}

Issue

When importing the module it seems like the generic typealias is not found.

  • Using the typealias from the module: ❌
  • Using the nested generic from the module: ✅
  • Using the redefined typealias: ✅
// TEST

// defining them again for testing
public typealias PalauDefaultsEntry2<T: PalauDefaultable> = PalauEntry<PalauOptional<PalauSingle<T>>>
public typealias PalauDefaultsEntryEnsured2<T: PalauDefaultable> = PalauEntry<PalauEnsured<PalauSingle<T>>>
public typealias PalauDefaultsArrayEntry2<T: PalauDefaultable> = PalauEntry<PalauOptional<PalauList<T>>>
public typealias PalauDefaultsArrayEntryEnsured2<T: PalauDefaultable> = PalauEntry<PalauEnsured<PalauList<T>>>

// This is not working
// p1 should be of type PalauDefaultsEntry<Bool>
//let p0x = p1

struct PD {

  // ✅ this is working
  public static var boolValues: PalauEntry<PalauOptional<PalauSingle<Bool>>> {
    get { return PalauDefaults.value("boolValues") }
    set { }
  }

  // ❌ this is not working
  public static var boolValue2: PalauDefaultsEntry<Bool> {
    get { return PalauDefaults.value("boolValues") }
    set { }
  }

  // ✅ But wait this is working too
  public static var boolValue3: PalauDefaultsEntry2<Bool> {
    get { return PalauDefaults.value("boolValues") }
    set { }
  }
}

Reproduce?

  • clone: Palau-2 Branch
  • Open: Tests/PalauDefaultsArrayTest.swift
  • Re-enable: Lines 371-375
  • Build Test

Sorry for missing comments. 😬 This totally WIP

Additional Info

In case you are wondering how PalauDefaults.value is defined:

// FRAMEWORK
public struct PalauDefaults {

  /// The underlying defaults
  public static var defaults: NSUD {
    return NSUD.standard
  }

  public static func value<T>(_ key: String) -> PalauDefaultsEntry<T>
    where T: PalauDefaultable, T.StoredType == T {
      return PalauEntry(key:key, defaults:defaults)
  }

  public static func value<T>(_ key: String, whenNil fallback: @autoclosure(escaping) () -> T) -> PalauDefaultsEntryEnsured<T>
    where T: PalauDefaultable, T.StoredType == T {
      return PalauEntry(key:key, defaults:defaults, fallback: fallback())
  }

  public static func value<T>(_ key: String) -> PalauDefaultsArrayEntry<T>
    where T: PalauDefaultable, T.StoredType == T {
      return PalauEntry(key:key, defaults:defaults)
  }

  public static func value<T>(_ key: String, whenNil fallback: @autoclosure(escaping) () -> [T]) -> PalauDefaultsArrayEntryEnsured<T>
    where T: PalauDefaultable, T.StoredType == T {
      return PalauEntry(key:key, defaults:defaults, fallback: fallback())
  }
}

build log

0  swift                    0x00000001106b1e3d PrintStackTraceSignalHandler(void*) + 45
1  swift                    0x00000001106b1886 SignalHandler(int) + 470
2  libsystem_platform.dylib 0x00007fff868f552a _sigtramp + 26
3  libsystem_platform.dylib 000000000000000000 _sigtramp + 2037426928
4  swift                    0x000000010df5417d swift::ModuleFile::getType(llvm::PointerEmbeddedInt<unsigned int, 31>) + 2301
5  swift                    0x000000010df5414c swift::ModuleFile::getType(llvm::PointerEmbeddedInt<unsigned int, 31>) + 2252
6  swift                    0x000000010df54e7f swift::ModuleFile::getType(llvm::PointerEmbeddedInt<unsigned int, 31>) + 5631
7  swift                    0x000000010df54e7f swift::ModuleFile::getType(llvm::PointerEmbeddedInt<unsigned int, 31>) + 5631
8  swift                    0x000000010df54e7f swift::ModuleFile::getType(llvm::PointerEmbeddedInt<unsigned int, 31>) + 5631
9  swift                    0x000000010df54168 swift::ModuleFile::getType(llvm::PointerEmbeddedInt<unsigned int, 31>) + 2280
10 swift                    0x000000010df4c8b4 swift::ModuleFile::getDecl(llvm::PointerEmbeddedInt<unsigned int, 31>, llvm::Optional<swift::DeclContext*>) + 18420
11 swift                    0x000000010df57f7a swift::ModuleFile::maybeReadPattern() + 682
12 swift                    0x000000010df5807e swift::ModuleFile::maybeReadPattern() + 942
13 swift                    0x000000010df4b51e swift::ModuleFile::getDecl(llvm::PointerEmbeddedInt<unsigned int, 31>, llvm::Optional<swift::DeclContext*>) + 13406
14 swift                    0x000000010df5c637 swift::ModuleFile::loadAllMembers(swift::Decl*, unsigned long long) + 647
15 swift                    0x000000010e2c342a (anonymous namespace)::Traversal::visitNominalTypeDecl(swift::NominalTypeDecl*) + 314
16 swift                    0x000000010e2c139a (anonymous namespace)::Traversal::doIt(swift::Decl*) + 234
17 swift                    0x000000010dcb038f swift::SILPassManager::SILPassManager(swift::SILModule*, llvm::StringRef) + 1439
18 swift                    0x000000010dcb50df swift::runSILDiagnosticPasses(swift::SILModule&) + 159
19 swift                    0x000000010d9863d7 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*) + 19079
20 swift                    0x000000010d97f679 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 18137
21 swift                    0x000000010d93c4a0 main + 10240
22 libdyld.dylib            0x00007fff82ca35ad start + 1
23 libdyld.dylib            0x000000000000003b start + 2100677263
Stack dump:
0.	Program arguments: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -emit-module /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/Objects-normal/x86_64/PalauDefaultsArrayTest~partial.swiftmodule /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/Objects-normal/x86_64/PalauTestHelpers~partial.swiftmodule -parse-as-library -target x86_64-apple-ios8.0 -enable-objc-interop -sdk /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.0.sdk -I /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Products/Debug-iphonesimulator -F /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Products/Debug-iphonesimulator -F /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks -enable-testing -g -module-cache-path /Users/elkr/Library/Developer/Xcode/DerivedData/ModuleCache -serialize-debugging-options -serialize-debugging-options -Xcc -I/Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/Palau iOS Tests-generated-files.hmap -Xcc -I/Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/Palau iOS Tests-own-target-headers.hmap -Xcc -I/Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/Palau iOS Tests-all-non-framework-target-headers.hmap -Xcc -ivfsoverlay -Xcc /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/all-product-headers.yaml -Xcc -iquote -Xcc /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/Palau iOS Tests-project-headers.hmap -Xcc -I/Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Products/Debug-iphonesimulator/include -Xcc -I/Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/DerivedSources/x86_64 -Xcc -I/Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/DerivedSources -Xcc -DDEBUG=1 -Xcc -working-directory/xcode-common/workspace/Palau -emit-module-doc-path /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/Objects-normal/x86_64/Palau_iOS_Tests.swiftdoc -module-name Palau_iOS_Tests -emit-objc-header-path /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/Objects-normal/x86_64/Palau_iOS_Tests-Swift.h -o /Users/elkr/Library/Developer/Xcode/DerivedData/Palau-belahwbrdteddtcugspivsutaljf/Build/Intermediates/Palau.build/Debug-iphonesimulator/Palau iOS Tests.build/Objects-normal/x86_64/Palau_iOS_Tests.swiftmodule 
1.	While loading members for 'PD' at <invalid loc>
2.	While deserializing decl #84 (PATTERN_BINDING_DECL)
3.	While deserializing decl #85 (VAR_DECL)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment