forked from OSchip/llvm-project
Add a bunch of missing calls to DiagnoseSentinelCalls. <rdar://problem/10885993>.
This should probably be refactored... but it isn't completely obvious what refactoring is best. llvm-svn: 150869
This commit is contained in:
parent
084e1b48a1
commit
ff4b407009
|
@ -8973,6 +8973,11 @@ Sema::CompleteConstructorCall(CXXConstructorDecl *Constructor,
|
|||
Proto, 0, Args, NumArgs, AllArgs,
|
||||
CallType);
|
||||
ConvertedArgs.append(AllArgs.begin(), AllArgs.end());
|
||||
|
||||
DiagnoseSentinelCalls(Constructor, Loc, AllArgs.data(), AllArgs.size());
|
||||
|
||||
// FIXME: Missing call to CheckFunctionCall or equivalent
|
||||
|
||||
return Invalid;
|
||||
}
|
||||
|
||||
|
|
|
@ -1228,6 +1228,11 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal,
|
|||
NumPlaceArgs = AllPlaceArgs.size();
|
||||
if (NumPlaceArgs > 0)
|
||||
PlaceArgs = &AllPlaceArgs[0];
|
||||
|
||||
DiagnoseSentinelCalls(OperatorNew, PlacementLParen,
|
||||
PlaceArgs, NumPlaceArgs);
|
||||
|
||||
// FIXME: Missing call to CheckFunctionCall or equivalent
|
||||
}
|
||||
|
||||
// Warn if the type is over-aligned and is being allocated by global operator
|
||||
|
|
|
@ -10398,6 +10398,8 @@ Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE,
|
|||
RParenLoc))
|
||||
return ExprError();
|
||||
|
||||
DiagnoseSentinelCalls(Method, LParenLoc, Args, NumArgs);
|
||||
|
||||
if (CheckFunctionCall(Method, TheCall))
|
||||
return ExprError();
|
||||
|
||||
|
@ -10701,6 +10703,8 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj,
|
|||
|
||||
if (IsError) return true;
|
||||
|
||||
DiagnoseSentinelCalls(Method, LParenLoc, Args, NumArgs);
|
||||
|
||||
if (CheckFunctionCall(Method, TheCall))
|
||||
return true;
|
||||
|
||||
|
|
|
@ -1,6 +1,23 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
|
||||
void f(int, ...) __attribute__((sentinel));
|
||||
|
||||
void g() {
|
||||
f(1, 2, __null);
|
||||
}
|
||||
|
||||
typedef __typeof__(sizeof(int)) size_t;
|
||||
|
||||
struct S {
|
||||
S(int,...) __attribute__((sentinel)); // expected-note {{marked sentinel}}
|
||||
void a(int,...) __attribute__((sentinel)); // expected-note {{marked sentinel}}
|
||||
void* operator new(size_t,...) __attribute__((sentinel)); // expected-note {{marked sentinel}}
|
||||
void operator()(int,...) __attribute__((sentinel)); // expected-note {{marked sentinel}}
|
||||
};
|
||||
|
||||
void class_test() {
|
||||
S s(1,2,3); // expected-warning {{missing sentinel in function call}}
|
||||
S* s2 = new (1,2,3) S(1, __null); // expected-warning {{missing sentinel in function call}}
|
||||
s2->a(1,2,3); // expected-warning {{missing sentinel in function call}}
|
||||
s(1,2,3); // expected-warning {{missing sentinel in function call}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue