diff --git a/include/swift/AST/IRGenOptions.h b/include/swift/AST/IRGenOptions.h index 2f11a629ef2..8c53ec0f49c 100644 --- a/include/swift/AST/IRGenOptions.h +++ b/include/swift/AST/IRGenOptions.h @@ -86,6 +86,9 @@ public: /// \brief Whether we're generating IR for the JIT. unsigned UseJIT : 1; + /// \brief Whether we allow dynamic value type layout. + unsigned EnableDynamicValueTypeLayout : 1; + /// \brief Whether we should run LLVM optimizations after IRGen. unsigned DisableLLVMOptzns : 1; @@ -119,8 +122,9 @@ public: IRGenOptions() : OutputKind(IRGenOutputKind::LLVMAssembly), Verify(true), Optimize(false), DebugInfoKind(IRGenDebugInfoKind::None), - UseJIT(false), DisableLLVMOptzns(false), - DisableLLVMARCOpts(false), DisableLLVMSLPVectorizer(false), + UseJIT(false), EnableDynamicValueTypeLayout(false), + DisableLLVMOptzns(false), DisableLLVMARCOpts(false), + DisableLLVMSLPVectorizer(false), DisableFPElim(true), HasUnderlyingModule(false), Playground(false), GenerateProfile(false), EmbedMode(IRGenEmbedMode::None) {} diff --git a/include/swift/Option/FrontendOptions.td b/include/swift/Option/FrontendOptions.td index 1ba6b02b8af..d5d0287b04b 100644 --- a/include/swift/Option/FrontendOptions.td +++ b/include/swift/Option/FrontendOptions.td @@ -174,6 +174,10 @@ def dump_clang_diagnostics : Flag<["-"], "dump-clang-diagnostics">, def emit_verbose_sil : Flag<["-"], "emit-verbose-sil">, HelpText<"Emit locations during SIL emission">; +def enable_dynamic_value_type_layout : + Flag<["-"], "enable-dynamic-value-type-layout">, + HelpText<"Enable experimental dynamic generic struct/enum/class type layout">; + def enable_experimental_patterns : Flag<["-"], "enable-experimental-patterns">, HelpText<"Enable experimental 'switch' pattern matching features">; diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 734aaa1351c..d3b05138c4a 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1028,6 +1028,8 @@ static bool ParseIRGenArgs(IRGenOptions &Opts, ArgList &Args, if (Args.hasArg(OPT_disable_llvm_verify)) Opts.Verify = false; + Opts.EnableDynamicValueTypeLayout |= + Args.hasArg(OPT_enable_dynamic_value_type_layout); Opts.HasUnderlyingModule |= Args.hasArg(OPT_import_underlying_module); if (Args.hasArg(OPT_autolink_force_load)) diff --git a/lib/IRGen/GenClass.cpp b/lib/IRGen/GenClass.cpp index f5d47ae9ba6..4c6b3084000 100644 --- a/lib/IRGen/GenClass.cpp +++ b/lib/IRGen/GenClass.cpp @@ -367,9 +367,23 @@ namespace { void addDirectFieldsFromClass(ClassDecl *theClass, SILType classType) { + bool complainedAboutUnimplementedLayout = false; for (VarDecl *var : theClass->getStoredProperties()) { SILType type = classType.getFieldType(var, *IGM.SILMod); auto &eltType = IGM.getTypeInfo(type); + + // FIXME: Type-parameter-dependent field layout isn't fully + // implemented yet for ObjC-derived classes. + if (theClass->isObjC() + && !eltType.isFixedSize() + && !IGM.Opts.EnableDynamicValueTypeLayout) { + if (!complainedAboutUnimplementedLayout) { + IGM.unimplemented(var->getLoc(), + "non-fixed class layout in ObjC-derived classes"); + complainedAboutUnimplementedLayout = true; + } + } + Elements.push_back(ElementLayout::getIncomplete(eltType)); AllStoredProperties.push_back(var); } diff --git a/test/IRGen/generic_classes_objc.sil b/test/IRGen/generic_classes_objc.sil index 1233f158ae3..b023d753bba 100644 --- a/test/IRGen/generic_classes_objc.sil +++ b/test/IRGen/generic_classes_objc.sil @@ -1,6 +1,6 @@ // RUN: rm -rf %t && mkdir %t // RUN: %build-irgen-test-overlays -// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir | FileCheck %s +// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -enable-dynamic-value-type-layout %s -emit-ir | FileCheck %s // REQUIRES: CPU=i386_or_x86_64 // REQUIRES: objc_interop diff --git a/test/IRGen/unimplemented_objc_generic_class.swift b/test/IRGen/unimplemented_objc_generic_class.swift new file mode 100644 index 00000000000..933b065d6f7 --- /dev/null +++ b/test/IRGen/unimplemented_objc_generic_class.swift @@ -0,0 +1,11 @@ +// RUN: %target-swift-frontend %s -emit-ir -verify -disable-objc-attr-requires-foundation-module + +// REQUIRES: objc_interop + +@objc class ObjCBox { + var x: T // expected-error{{unimplemented}} + + init(x: T) { + self.x = x + } +} diff --git a/test/Interpreter/generic_objc_subclass.swift b/test/Interpreter/generic_objc_subclass.swift index 43433e0db81..e8159af02e9 100644 --- a/test/Interpreter/generic_objc_subclass.swift +++ b/test/Interpreter/generic_objc_subclass.swift @@ -2,7 +2,7 @@ // RUN: mkdir -p %t // // RUN: %target-clang -fobjc-arc %S/Inputs/ObjCClasses/ObjCClasses.m -c -o %t/ObjCClasses.o -// RUN: %target-build-swift -I %S/Inputs/ObjCClasses/ -Xlinker %t/ObjCClasses.o %s -o %t/a.out +// RUN: %target-build-swift -Xfrontend -enable-dynamic-value-type-layout -I %S/Inputs/ObjCClasses/ -Xlinker %t/ObjCClasses.o %s -o %t/a.out // RUN: %target-run %t/a.out | FileCheck %s // XFAIL: linux diff --git a/validation-test/compiler_crashers_fixed/0054-swift-substitutedtype-get.swift b/validation-test/compiler_crashers/0054-swift-substitutedtype-get.swift similarity index 84% rename from validation-test/compiler_crashers_fixed/0054-swift-substitutedtype-get.swift rename to validation-test/compiler_crashers/0054-swift-substitutedtype-get.swift index 6abc8505a71..2ccaebb92ca 100644 --- a/validation-test/compiler_crashers_fixed/0054-swift-substitutedtype-get.swift +++ b/validation-test/compiler_crashers/0054-swift-substitutedtype-get.swift @@ -1,4 +1,4 @@ -// RUN: %target-swift-frontend %s -emit-ir +// RUN: not --crash %target-swift-frontend %s -emit-ir // REQUIRES: objc_interop