Skip to content

Commit 7196ddc

Browse files
committed
Initial impl.
1 parent 54e4400 commit 7196ddc

File tree

1 file changed

+56
-4
lines changed

1 file changed

+56
-4
lines changed

lib/SILOptimizer/Mandatory/DefiniteInitialization.cpp

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
#include "swift/AST/DiagnosticsSIL.h"
1818
#include "swift/AST/DistributedDecl.h"
1919
#include "swift/AST/Expr.h"
20+
#include "swift/AST/ParameterList.h"
21+
#include "swift/AST/SemanticAttrs.h"
2022
#include "swift/AST/Stmt.h"
21-
#include "swift/Basic/Assertions.h"
2223
#include "swift/ClangImporter/ClangModule.h"
2324
#include "swift/SIL/BasicBlockBits.h"
24-
#include "swift/AST/SemanticAttrs.h"
2525
#include "swift/SIL/BasicBlockData.h"
2626
#include "swift/SIL/InstructionUtils.h"
2727
#include "swift/SIL/MemAccessUtils.h"
@@ -30,7 +30,6 @@
3030
#include "swift/SIL/SILValue.h"
3131
#include "swift/SILOptimizer/PassManager/Passes.h"
3232
#include "swift/SILOptimizer/PassManager/Transforms.h"
33-
#include "swift/SILOptimizer/Utils/CFGOptUtils.h"
3433
#include "swift/SILOptimizer/Utils/DistributedActor.h"
3534
#include "swift/SILOptimizer/Utils/InstOptUtils.h"
3635
#include "llvm/ADT/STLExtras.h"
@@ -2298,8 +2297,61 @@ bool LifetimeChecker::diagnoseReturnWithoutInitializingStoredProperties(
22982297
theStruct->getParentModule()->getName(),
22992298
theStruct->hasClangNode());
23002299
} else {
2300+
// to generate the missing variables
2301+
std::string missingVariablesMessage;
2302+
std::string suggestedInitializerString;
2303+
AvailabilitySet Liveness =
2304+
getLivenessAtInst(Use.Inst, Use.FirstElement, Use.NumElements);
2305+
for (unsigned i = Use.FirstElement, e = Use.FirstElement + Use.NumElements;
2306+
i != e; ++i) {
2307+
// Ignore a failed super.init requirement.
2308+
if (i == TheMemory.getNumElements() - 1 && TheMemory.isDerivedClassSelf())
2309+
continue;
2310+
2311+
std::string Name;
2312+
auto *Decl = TheMemory.getPathStringToElement(i, Name);
2313+
2314+
auto propertyInitIsolation = ActorIsolation::forUnspecified();
2315+
2316+
std::string inferredDeclType;
2317+
if (Decl) {
2318+
if (auto *var = dyn_cast<VarDecl>(Decl)) {
2319+
inferredDeclType = var->getValueInterfaceType().getString();
2320+
propertyInitIsolation = var->getInitializerIsolation();
2321+
}
2322+
2323+
// If it's marked @_compilerInitialized, delay emission of the note.
2324+
if (Decl->getAttrs().hasAttribute<CompilerInitializedAttr>()) {
2325+
continue;
2326+
}
2327+
}
2328+
2329+
if (propertyInitIsolation.isGlobalActor()) {
2330+
continue;
2331+
}
2332+
2333+
auto declNameWithoutSelf = StringRef(Name).split(".").second;
2334+
suggestedInitializerString +=
2335+
std::string(declNameWithoutSelf) + ":" + inferredDeclType + ",";
2336+
missingVariablesMessage +=
2337+
Name + "=" + std::string(declNameWithoutSelf) + "\n";
2338+
}
2339+
2340+
suggestedInitializerString.pop_back();
2341+
23012342
diagnose(Module, loc,
2302-
diag::return_from_init_without_initing_stored_properties);
2343+
diag::return_from_init_without_initing_stored_properties)
2344+
.fixItInsert(loc.getEndSourceLoc(), missingVariablesMessage);
2345+
2346+
Decl *decl = Inst->getFunction()->getDeclContext()->getAsDecl();
2347+
2348+
if (auto *functionDecl = dyn_cast<AbstractFunctionDecl>(decl)) {
2349+
auto RParenLoc = functionDecl->getParameters()->getRParenLoc();
2350+
auto initFunctionLocation = SILLocation(functionDecl);
2351+
2352+
diagnose(Module, initFunctionLocation, diag::return_from_init_without_initing_stored_properties)
2353+
.fixItInsert(RParenLoc, suggestedInitializerString);
2354+
}
23032355
noteUninitializedMembers(Use);
23042356
}
23052357

0 commit comments

Comments
 (0)