From 92493e5e96b86f4976499eacc9233461ade1de8d Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 13 Nov 2014 23:19:36 +0000 Subject: [PATCH] -Wsentinel: Suggest nullptr in C++11 instead of NULL llvm-svn: 221945 --- clang/lib/Sema/SemaExpr.cpp | 6 ++++-- clang/test/Sema/sentinel-attribute.c | 13 ++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index dda9d88..de08011 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -398,8 +398,8 @@ void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc, if (sentinelExpr->isValueDependent()) return; if (Context.isSentinelNullExpr(sentinelExpr)) return; - // Pick a reasonable string to insert. Optimistically use 'nil' or - // 'NULL' if those are actually defined in the context. Only use + // Pick a reasonable string to insert. Optimistically use 'nil', 'nullptr', + // or 'NULL' if those are actually defined in the context. Only use // 'nil' for ObjC methods, where it's much more likely that the // variadic arguments form a list of object pointers. SourceLocation MissingNilLoc @@ -408,6 +408,8 @@ void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc, if (calleeType == CT_Method && PP.getIdentifierInfo("nil")->hasMacroDefinition()) NullValue = "nil"; + else if (getLangOpts().CPlusPlus11) + NullValue = "nullptr"; else if (PP.getIdentifierInfo("NULL")->hasMacroDefinition()) NullValue = "NULL"; else diff --git a/clang/test/Sema/sentinel-attribute.c b/clang/test/Sema/sentinel-attribute.c index 46f1350..1beae87 100644 --- a/clang/test/Sema/sentinel-attribute.c +++ b/clang/test/Sema/sentinel-attribute.c @@ -1,7 +1,11 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: not %clang_cc1 -fsyntax-only %s -fdiagnostics-parseable-fixits 2>&1 | \ +// RUN: FileCheck %s --check-prefix=C +// RUN: not %clang_cc1 -fsyntax-only %s -fdiagnostics-parseable-fixits -x c++ -std=c++11 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CXX11 int x __attribute__((sentinel)); //expected-warning{{'sentinel' attribute only applies to functions, methods and blocks}} -void f1(int a, ...) __attribute__ ((sentinel)); +void f1(int a, ...) __attribute__ ((sentinel)); // expected-note {{function has been explicitly marked sentinel here}} void f2(int a, ...) __attribute__ ((sentinel(1))); void f3(int a, ...) __attribute__ ((sentinel("hello"))); //expected-error{{'sentinel' attribute requires parameter 1 to be an integer constant}} @@ -13,3 +17,10 @@ void f5(int a) __attribute__ ((sentinel)); //expected-warning{{'sentinel' attrib void f6() __attribute__((__sentinel__)); // expected-warning {{'sentinel' attribute requires named arguments}} + +void g() { + // The integer literal zero is not a sentinel. + f1(1, 0); // expected-warning {{missing sentinel in function call}} +// C: fix-it:{{.*}}:{23:10-23:10}:", (void*) 0" +// CXX11: fix-it:{{.*}}:{23:10-23:10}:", nullptr" +} -- 2.7.4