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:
Eli Friedman 2012-02-18 04:48:30 +00:00
parent 084e1b48a1
commit ff4b407009
4 changed files with 31 additions and 0 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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;

View File

@ -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}}
}