Skip to content
Snippets Groups Projects
Commit 79b4e894 authored by Reid Kleckner's avatar Reid Kleckner
Browse files

-Wsentinel: Suggest nullptr in C++11 instead of NULL

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@221945 91177308-0d34-0410-b5e6-96231b3b80d8
parent 739237cc
No related branches found
No related tags found
No related merge requests found
...@@ -398,8 +398,8 @@ void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc, ...@@ -398,8 +398,8 @@ void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
if (sentinelExpr->isValueDependent()) return; if (sentinelExpr->isValueDependent()) return;
if (Context.isSentinelNullExpr(sentinelExpr)) return; if (Context.isSentinelNullExpr(sentinelExpr)) return;
   
// Pick a reasonable string to insert. Optimistically use 'nil' or // Pick a reasonable string to insert. Optimistically use 'nil', 'nullptr',
// 'NULL' if those are actually defined in the context. Only use // or 'NULL' if those are actually defined in the context. Only use
// 'nil' for ObjC methods, where it's much more likely that the // 'nil' for ObjC methods, where it's much more likely that the
// variadic arguments form a list of object pointers. // variadic arguments form a list of object pointers.
SourceLocation MissingNilLoc SourceLocation MissingNilLoc
...@@ -408,6 +408,8 @@ void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc, ...@@ -408,6 +408,8 @@ void Sema::DiagnoseSentinelCalls(NamedDecl *D, SourceLocation Loc,
if (calleeType == CT_Method && if (calleeType == CT_Method &&
PP.getIdentifierInfo("nil")->hasMacroDefinition()) PP.getIdentifierInfo("nil")->hasMacroDefinition())
NullValue = "nil"; NullValue = "nil";
else if (getLangOpts().CPlusPlus11)
NullValue = "nullptr";
else if (PP.getIdentifierInfo("NULL")->hasMacroDefinition()) else if (PP.getIdentifierInfo("NULL")->hasMacroDefinition())
NullValue = "NULL"; NullValue = "NULL";
else else
......
// RUN: %clang_cc1 -fsyntax-only -verify %s // 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}} 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 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}} 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 ...@@ -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 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"
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment