From 3377591b3c85a425c689948b0fb356d7492dc0d4 Mon Sep 17 00:00:00 2001 From: Xi Ge Date: Thu, 2 Dec 2021 12:18:26 -0800 Subject: [PATCH] sema: always record fix for mismatched constness. Also, this commit has added a test for using _const values in property wrapper. --- lib/Sema/CSSimplify.cpp | 22 +++++----- test/Sema/const_in_property_wrapper.swift | 50 +++++++++++++++++++++++ 2 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 test/Sema/const_in_property_wrapper.swift diff --git a/lib/Sema/CSSimplify.cpp b/lib/Sema/CSSimplify.cpp index b22bee0497543..6d3fca2da493a 100644 --- a/lib/Sema/CSSimplify.cpp +++ b/lib/Sema/CSSimplify.cpp @@ -1505,19 +1505,17 @@ ConstraintSystem::TypeMatchResult constraints::matchCallArguments( } } if (!argument.isCompileTimeConst() && param.isCompileTimeConst()) { - if (cs.shouldAttemptFixes()) { - auto *locator = cs.getConstraintLocator(loc); - SourceRange range; - // simplify locator so the anchor is the exact argument. - locator = simplifyLocator(cs, locator, range); - if (locator->getPath().empty() && - locator->getAnchor().isExpr(ExprKind::UnresolvedMemberChainResult)) { - locator = - cs.getConstraintLocator(cast( - locator->getAnchor().get())->getChainBase()); - } - cs.recordFix(NotCompileTimeConst::create(cs, paramTy, locator)); + auto *locator = cs.getConstraintLocator(loc); + SourceRange range; + // simplify locator so the anchor is the exact argument. + locator = simplifyLocator(cs, locator, range); + if (locator->getPath().empty() && + locator->getAnchor().isExpr(ExprKind::UnresolvedMemberChainResult)) { + locator = + cs.getConstraintLocator(cast( + locator->getAnchor().get())->getChainBase()); } + cs.recordFix(NotCompileTimeConst::create(cs, paramTy, locator)); } cs.addConstraint( diff --git a/test/Sema/const_in_property_wrapper.swift b/test/Sema/const_in_property_wrapper.swift new file mode 100644 index 0000000000000..a7889c3fe2790 --- /dev/null +++ b/test/Sema/const_in_property_wrapper.swift @@ -0,0 +1,50 @@ +// RUN: %target-typecheck-verify-swift + +enum Colors { + case blue + case red +} + +let globalString = "" +let globalInt = 2 +let globalColor = Colors.blue + +func giveMeBlue() -> Colors { + return .blue +} + +@propertyWrapper struct Wrapper { + let key: String + var wrappedValue: Value? { get { return nil } set { } } + init(_ key: _const String) {self.key = key } + init(_ key: _const Int) {self.key = "" } + init(_ key: _const Colors) { self.key = ""} +} + +struct WrapperAdopters { + @Wrapper(3) + var wrappedVar_correct_1 + + @Wrapper("") + var wrappedVar_correct_2 + + @Wrapper(.blue) + var wrappedVar_correct_3 + + @Wrapper(Colors.blue) + var wrappedVar_correct_4 +} + +struct WrapperAdopters_incorrect { + @Wrapper(globalInt) // expected-error{{expect a compile-time constant literal}} + var wrappedVar_incorrect_1 + + @Wrapper(globalString) // expected-error{{expect a compile-time constant literal}} + var wrappedVar_incorrect_2 + + @Wrapper(globalColor) // expected-error{{expect a compile-time constant literal}} + var wrappedVar_incorrect_3 + + @Wrapper(giveMeBlue()) // expected-error{{expect a compile-time constant literal}} + var wrappedVar_incorrect_4 +}