From ff4b40700996235098d8fa347a919a4fe808f057 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Sat, 18 Feb 2012 04:48:30 +0000 Subject: [PATCH] Add a bunch of missing calls to DiagnoseSentinelCalls. . This should probably be refactored... but it isn't completely obvious what refactoring is best. llvm-svn: 150869 --- clang/lib/Sema/SemaDeclCXX.cpp | 5 +++++ clang/lib/Sema/SemaExprCXX.cpp | 5 +++++ clang/lib/Sema/SemaOverload.cpp | 4 ++++ clang/test/SemaCXX/attr-sentinel.cpp | 17 +++++++++++++++++ 4 files changed, 31 insertions(+) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index d271921b7bc3..0b785f309905 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -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; } diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 74bac6714007..80078207da6d 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -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 diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 2b025da08854..bc48f08a3408 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -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; diff --git a/clang/test/SemaCXX/attr-sentinel.cpp b/clang/test/SemaCXX/attr-sentinel.cpp index 56c8f881600b..92c6e21444fa 100644 --- a/clang/test/SemaCXX/attr-sentinel.cpp +++ b/clang/test/SemaCXX/attr-sentinel.cpp @@ -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}} +}