forked from OSchip/llvm-project
Fix an assertion failure instantiating a constexpr function from within a -dealloc method. PR13401.
llvm-svn: 161135
This commit is contained in:
parent
8724d0fd99
commit
22be06a250
|
@ -84,6 +84,14 @@ public:
|
|||
/// \brief Whether this function contains any indirect gotos.
|
||||
bool HasIndirectGoto;
|
||||
|
||||
/// A flag that is set when parsing a -dealloc method and no [super dealloc]
|
||||
/// call was found yet.
|
||||
bool ObjCShouldCallSuperDealloc;
|
||||
|
||||
/// A flag that is set when parsing a -finalize method and no [super finalize]
|
||||
/// call was found yet.
|
||||
bool ObjCShouldCallSuperFinalize;
|
||||
|
||||
/// \brief Used to determine if errors occurred in this function or block.
|
||||
DiagnosticErrorTrap ErrorTrap;
|
||||
|
||||
|
@ -127,6 +135,8 @@ public:
|
|||
HasBranchProtectedScope(false),
|
||||
HasBranchIntoScope(false),
|
||||
HasIndirectGoto(false),
|
||||
ObjCShouldCallSuperDealloc(false),
|
||||
ObjCShouldCallSuperFinalize(false),
|
||||
ErrorTrap(Diag) { }
|
||||
|
||||
virtual ~FunctionScopeInfo();
|
||||
|
|
|
@ -542,13 +542,6 @@ public:
|
|||
/// have been declared.
|
||||
bool GlobalNewDeleteDeclared;
|
||||
|
||||
/// A flag that is set when parsing a -dealloc method and no [super dealloc]
|
||||
/// call was found yet.
|
||||
bool ObjCShouldCallSuperDealloc;
|
||||
/// A flag that is set when parsing a -finalize method and no [super finalize]
|
||||
/// call was found yet.
|
||||
bool ObjCShouldCallSuperFinalize;
|
||||
|
||||
/// \brief Describes how the expressions currently being parsed are
|
||||
/// evaluated at run-time, if at all.
|
||||
enum ExpressionEvaluationContext {
|
||||
|
|
|
@ -97,8 +97,6 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
|
|||
NSArrayDecl(0), ArrayWithObjectsMethod(0),
|
||||
NSDictionaryDecl(0), DictionaryWithObjectsMethod(0),
|
||||
GlobalNewDeleteDeclared(false),
|
||||
ObjCShouldCallSuperDealloc(false),
|
||||
ObjCShouldCallSuperFinalize(false),
|
||||
TUKind(TUKind),
|
||||
NumSFINAEErrors(0), InFunctionDeclarator(0),
|
||||
AccessCheckingSFINAE(false), InNonInstantiationSFINAEContext(false),
|
||||
|
|
|
@ -7715,22 +7715,24 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body,
|
|||
if (Body)
|
||||
computeNRVO(Body, getCurFunction());
|
||||
}
|
||||
if (ObjCShouldCallSuperDealloc) {
|
||||
if (getCurFunction()->ObjCShouldCallSuperDealloc) {
|
||||
Diag(MD->getLocEnd(), diag::warn_objc_missing_super_dealloc);
|
||||
ObjCShouldCallSuperDealloc = false;
|
||||
getCurFunction()->ObjCShouldCallSuperDealloc = false;
|
||||
}
|
||||
if (ObjCShouldCallSuperFinalize) {
|
||||
if (getCurFunction()->ObjCShouldCallSuperFinalize) {
|
||||
Diag(MD->getLocEnd(), diag::warn_objc_missing_super_finalize);
|
||||
ObjCShouldCallSuperFinalize = false;
|
||||
getCurFunction()->ObjCShouldCallSuperFinalize = false;
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
assert(!ObjCShouldCallSuperDealloc && "This should only be set for "
|
||||
"ObjC methods, which should have been handled in the block above.");
|
||||
assert(!ObjCShouldCallSuperFinalize && "This should only be set for "
|
||||
"ObjC methods, which should have been handled in the block above.");
|
||||
assert(!getCurFunction()->ObjCShouldCallSuperDealloc &&
|
||||
"This should only be set for ObjC methods, which should have been "
|
||||
"handled in the block above.");
|
||||
assert(!getCurFunction()->ObjCShouldCallSuperFinalize &&
|
||||
"This should only be set for ObjC methods, which should have been "
|
||||
"handled in the block above.");
|
||||
|
||||
// Verify and clean out per-function state.
|
||||
if (Body) {
|
||||
|
|
|
@ -380,11 +380,11 @@ void Sema::ActOnStartOfObjCMethodOrCFunctionDef(Scope *FnBodyScope, Decl *D,
|
|||
// Finally, in ActOnFinishFunctionBody() (SemaDecl), warn if flag is set.
|
||||
// Only do this if the current class actually has a superclass.
|
||||
if (IC->getSuperClass()) {
|
||||
ObjCShouldCallSuperDealloc =
|
||||
getCurFunction()->ObjCShouldCallSuperDealloc =
|
||||
!(Context.getLangOpts().ObjCAutoRefCount ||
|
||||
Context.getLangOpts().getGC() == LangOptions::GCOnly) &&
|
||||
MDecl->getMethodFamily() == OMF_dealloc;
|
||||
ObjCShouldCallSuperFinalize =
|
||||
getCurFunction()->ObjCShouldCallSuperFinalize =
|
||||
Context.getLangOpts().getGC() != LangOptions::NonGC &&
|
||||
MDecl->getMethodFamily() == OMF_finalize;
|
||||
}
|
||||
|
|
|
@ -1778,9 +1778,9 @@ ExprResult Sema::ActOnSuperMessage(Scope *S,
|
|||
// is acting as a keyword.
|
||||
if (Method->isInstanceMethod()) {
|
||||
if (Sel.getMethodFamily() == OMF_dealloc)
|
||||
ObjCShouldCallSuperDealloc = false;
|
||||
getCurFunction()->ObjCShouldCallSuperDealloc = false;
|
||||
if (Sel.getMethodFamily() == OMF_finalize)
|
||||
ObjCShouldCallSuperFinalize = false;
|
||||
getCurFunction()->ObjCShouldCallSuperFinalize = false;
|
||||
|
||||
// Since we are in an instance method, this is an instance
|
||||
// message to the superclass instance.
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
||||
// PR13401
|
||||
|
||||
__attribute((objc_root_class)) @interface NSObject
|
||||
@end
|
||||
|
||||
@interface Dummy : NSObject
|
||||
@end
|
||||
|
||||
template<typename T> struct shared_ptr {
|
||||
constexpr shared_ptr() {}
|
||||
};
|
||||
|
||||
@implementation Dummy
|
||||
- (void)dealloc
|
||||
{
|
||||
constexpr shared_ptr<int> dummy;
|
||||
} // expected-warning {{method possibly missing a [super dealloc] call}}
|
||||
@end
|
Loading…
Reference in New Issue