Index: include/clang/Basic/DiagnosticDriverKinds.td =================================================================== --- include/clang/Basic/DiagnosticDriverKinds.td +++ include/clang/Basic/DiagnosticDriverKinds.td @@ -138,6 +138,9 @@ def err_drv_lto_without_lld : Error<"LTO requires -fuse-ld=lld">; def err_drv_preamble_format : Error< "incorrect format for -preamble-bytes=N,END">; +def err_invalid_ios_deployment_target : Error< + "invalid iOS deployment version '%0', iOS 10 is the maximum deployment " + "target for 32-bit targets">; def err_drv_conflicting_deployment_targets : Error< "conflicting deployment targets, both '%0' and '%1' are present in environment">; def err_arc_unsupported_on_runtime : Error< Index: lib/Driver/ToolChains/Darwin.cpp =================================================================== --- lib/Driver/ToolChains/Darwin.cpp +++ lib/Driver/ToolChains/Darwin.cpp @@ -1150,6 +1150,17 @@ Args.getLastArg(options::OPT_mwatchos_version_min_EQ, options::OPT_mwatchos_simulator_version_min_EQ); + unsigned Major, Minor, Micro; + bool HadExtra; + + // iOS 10 is the maximum deployment target for 32-bit targets. + if (iOSVersion && getTriple().isArch32Bit() && + Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro, + HadExtra) && + Major > 10) + getDriver().Diag(diag::err_invalid_ios_deployment_target) + << iOSVersion->getAsString(Args); + // Add a macro to differentiate between m(iphone|tv|watch)os-version-min=X.Y and // -m(iphone|tv|watch)simulator-version-min=X.Y. if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ) || @@ -1191,6 +1202,14 @@ if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET")) WatchOSTarget = env; + // iOS 10 is the maximum deployment target for 32-bit targets. + if (!iOSTarget.empty() && getTriple().isArch32Bit() && + Driver::GetReleaseVersion(iOSTarget.c_str(), Major, Minor, Micro, + HadExtra) && + Major > 10) + getDriver().Diag(diag::err_invalid_ios_deployment_target) + << std::string("IPHONEOS_DEPLOYMENT_TARGET=") + iOSTarget; + // If there is no command-line argument to specify the Target version and // no environment variable defined, see if we can set the default based // on -isysroot. @@ -1308,8 +1327,6 @@ llvm_unreachable("Unable to infer Darwin variant"); // Set the tool chain target information. - unsigned Major, Minor, Micro; - bool HadExtra; if (Platform == MacOS) { assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) && "Unknown target platform!"); @@ -1325,6 +1342,12 @@ HadExtra || Major >= 100 || Minor >= 100 || Micro >= 100) getDriver().Diag(diag::err_drv_invalid_version_number) << iOSVersion->getAsString(Args); + // iOS 10 is the maximum deployment target for 32-bit targets. If the + // inferred deployment target is iOS 11 or later, set it to 10.99. + if (getTriple().isArch32Bit() && Major >= 11) { + Major = 10; + Minor = 99; + } } else if (Platform == TvOS) { if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor, Micro, HadExtra) || HadExtra || Index: test/Driver/darwin-version.c =================================================================== --- test/Driver/darwin-version.c +++ test/Driver/darwin-version.c @@ -10,6 +10,41 @@ // RUN: %clang -target armv6-apple-darwin9 -miphoneos-version-min=3.0 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-IOS3 %s // CHECK-VERSION-IOS3: "armv6k-apple-ios3.0.0" + +// RUN: env IPHONEOS_DEPLOYMENT_TARGET=11.0 \ +// RUN: %clang -target armv7-apple-ios9.0 -c -### %s 2> %t.err +// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-VERSION-IOS4 %s +// CHECK-VERSION-IOS4: invalid iOS deployment version 'IPHONEOS_DEPLOYMENT_TARGET=11.0' + +// RUN: %clang -target armv7-apple-ios9.0 -miphoneos-version-min=11.0 -c -### %s 2> %t.err +// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-VERSION-IOS5 %s +// CHECK-VERSION-IOS5: invalid iOS deployment version '-miphoneos-version-min=11.0' + +// RUN: %clang -target i386-apple-darwin -mios-simulator-version-min=11.0 -c -### %s 2> %t.err +// RUN: FileCheck --input-file=%t.err --check-prefix=CHECK-VERSION-IOS6 %s +// CHECK-VERSION-IOS6: invalid iOS deployment version '-mios-simulator-version-min=11.0' + +// RUN: %clang -target armv7-apple-ios11.1 -c -### %s 2>&1 | \ +// RUN: FileCheck --check-prefix=CHECK-VERSION-IOS7 %s +// CHECK-VERSION-IOS7: thumbv7-apple-ios10.99.0 + +// RUN: env IPHONEOS_DEPLOYMENT_TARGET=11.0 \ +// RUN: %clang -target arm64-apple-ios11.0 -c -### %s 2>&1 | \ +// RUN: FileCheck --check-prefix=CHECK-VERSION-IOS8 %s +// CHECK-VERSION-IOS8: arm64-apple-ios11.0.0 + +// RUN: %clang -target arm64-apple-ios11.0 -miphoneos-version-min=11.0 -c -### %s 2>&1 | \ +// RUN: FileCheck --check-prefix=CHECK-VERSION-IOS9 %s +// CHECK-VERSION-IOS9: arm64-apple-ios11.0.0 + +// RUN: %clang -target x86_64-apple-darwin -mios-simulator-version-min=11.0 -c -### %s 2>&1 | \ +// RUN: FileCheck --check-prefix=CHECK-VERSION-IOS10 %s +// CHECK-VERSION-IOS10: x86_64-apple-ios11.0.0 + +// RUN: %clang -target arm64-apple-ios11.1 -c -### %s 2>&1 | \ +// RUN: FileCheck --check-prefix=CHECK-VERSION-IOS11 %s +// CHECK-VERSION-IOS11: arm64-apple-ios11.1.0 + // RUN: %clang -target i686-apple-darwin8 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-OSX4 %s // RUN: %clang -target i686-apple-darwin9 -mmacosx-version-min=10.4 -c %s -### 2>&1 | \