From: Richard Trieu Date: Wed, 26 Mar 2014 01:55:33 +0000 (+0000) Subject: Add existing warnings to -Waddress so that it works closer to what GCC has. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=99db70b1fcb45e2e3e901d5df9611ee28fa79839;p=clang Add existing warnings to -Waddress so that it works closer to what GCC has. Previously, -Waddress was empty. Fixes PR9043. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204776 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticGroups.td b/include/clang/Basic/DiagnosticGroups.td index 8066ed5a3e..5df740fa95 100644 --- a/include/clang/Basic/DiagnosticGroups.td +++ b/include/clang/Basic/DiagnosticGroups.td @@ -19,7 +19,6 @@ def Implicit : DiagGroup<"implicit", [ // Empty DiagGroups are recognized by clang but ignored. def : DiagGroup<"abi">; def AbsoluteValue : DiagGroup<"absolute-value">; -def : DiagGroup<"address">; def AddressOfTemporary : DiagGroup<"address-of-temporary">; def : DiagGroup<"aggregate-return">; def GNUAlignofExpression : DiagGroup<"gnu-alignof-expression">; @@ -38,7 +37,8 @@ def ConstantConversion : def LiteralConversion : DiagGroup<"literal-conversion">; def StringConversion : DiagGroup<"string-conversion">; def SignConversion : DiagGroup<"sign-conversion">; -def BoolConversion : DiagGroup<"bool-conversion">; +def PointerBoolConversion : DiagGroup<"pointer-bool-conversion">; +def BoolConversion : DiagGroup<"bool-conversion", [ PointerBoolConversion ] >; def IntConversion : DiagGroup<"int-conversion">; def EnumConversion : DiagGroup<"enum-conversion">; def EnumTooLarge : DiagGroup<"enum-too-large">; @@ -284,6 +284,7 @@ def StaticLocalInInline : DiagGroup<"static-local-in-inline">; def GNUStaticFloatInit : DiagGroup<"gnu-static-float-init">; def StaticFloatInit : DiagGroup<"static-float-init", [GNUStaticFloatInit]>; def GNUStatementExpression : DiagGroup<"gnu-statement-expression">; +def StringCompare : DiagGroup<"string-compare">; def StringPlusInt : DiagGroup<"string-plus-int">; def StringPlusChar : DiagGroup<"string-plus-char">; def StrncatSize : DiagGroup<"strncat-size">; @@ -442,6 +443,11 @@ def UnreachableCodeAggressive : DiagGroup<"unreachable-code-aggressive", // Aggregation warning settings. +// Populate -Waddress with warnings from other groups. +def : DiagGroup<"address", [PointerBoolConversion, + StringCompare, + TautologicalPointerCompare]>; + // -Widiomatic-parentheses contains warnings about 'idiomatic' // missing parentheses; it is off by default. We do not include it // in -Wparentheses because most users who use -Wparentheses explicitly diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 105974b6c1..13ad527d6c 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -2350,7 +2350,7 @@ def warn_impcast_floating_point_to_bool : Warning< def warn_impcast_pointer_to_bool : Warning< "address of%select{| function| array}0 '%1' will always evaluate to " "'true'">, - InGroup; + InGroup; def warn_null_pointer_compare : Warning< "comparison of %select{address of|function|array}0 '%1' %select{not |}2" "equal to a null pointer is always %select{true|false}2">, @@ -6375,7 +6375,7 @@ def warn_comparison_always : Warning< def warn_stringcompare : Warning< "result of comparison against %select{a string literal|@encode}0 is " "unspecified (use strncmp instead)">, - InGroup>; + InGroup; def warn_identity_field_assign : Warning< "assigning %select{field|instance variable}0 to itself">, diff --git a/test/SemaCXX/warn-address.cpp b/test/SemaCXX/warn-address.cpp new file mode 100644 index 0000000000..219edfdc80 --- /dev/null +++ b/test/SemaCXX/warn-address.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wno-bool-conversion -Wno-string-compare -Wno-tautological-compare -Waddress %s +// RUN: %clang_cc1 -fsyntax-only -verify %s + +void foo(); +int arr[5]; +int global; +const char* str = ""; + +void test() { + if (foo) {} // expected-warning{{always evaluate to 'true'}} \ + // expected-note{{silence}} + if (arr) {} // expected-warning{{always evaluate to 'true'}} + if (&global) {} // expected-warning{{always evaluate to 'true'}} + if (foo == 0) {} // expected-warning{{always false}} \ + // expected-note{{silence}} + if (arr == 0) {} // expected-warning{{always false}} + if (&global == 0) {} // expected-warning{{always false}} + + if (str == "foo") {} // expected-warning{{unspecified}} +}