Enter the cleanups for a block outside the enclosing
full-expression. Naturally they're inactive before we enter the block literal expression. This restores the intended behavior that blocks belong to their enclosing scope. There's a useful -O0 / compile-time optimization that we're missing here with activating cleanups following straight-line code from their inactive beginnings. llvm-svn: 144268
This commit is contained in:
@@ -33,7 +33,7 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm)
|
||||
: CodeGenTypeCache(cgm), CGM(cgm),
|
||||
Target(CGM.getContext().getTargetInfo()), Builder(cgm.getModule().getContext()),
|
||||
AutoreleaseResult(false), BlockInfo(0), BlockPointer(0),
|
||||
NormalCleanupDest(0), NextCleanupDestIndex(1),
|
||||
NormalCleanupDest(0), NextCleanupDestIndex(1), FirstBlockInfo(0),
|
||||
EHResumeBlock(0), ExceptionSlot(0), EHSelectorSlot(0),
|
||||
DebugInfo(0), DisableDebugInfo(false), DidCallStackSave(false),
|
||||
IndirectBranch(0), SwitchInsn(0), CaseRangeBlock(0), UnreachableBlock(0),
|
||||
@@ -45,6 +45,14 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm)
|
||||
CGM.getCXXABI().getMangleContext().startNewFunction();
|
||||
}
|
||||
|
||||
CodeGenFunction::~CodeGenFunction() {
|
||||
// If there are any unclaimed block infos, go ahead and destroy them
|
||||
// now. This can happen if IR-gen gets clever and skips evaluating
|
||||
// something.
|
||||
if (FirstBlockInfo)
|
||||
destroyBlockInfos(FirstBlockInfo);
|
||||
}
|
||||
|
||||
|
||||
llvm::Type *CodeGenFunction::ConvertTypeForMem(QualType T) {
|
||||
return CGM.getTypes().ConvertTypeForMem(T);
|
||||
|
||||
Reference in New Issue
Block a user