]> granicus.if.org Git - clang/commitdiff
Add existing warnings to -Waddress so that it works closer to what GCC has.
authorRichard Trieu <rtrieu@google.com>
Wed, 26 Mar 2014 01:55:33 +0000 (01:55 +0000)
committerRichard Trieu <rtrieu@google.com>
Wed, 26 Mar 2014 01:55:33 +0000 (01:55 +0000)
Previously, -Waddress was empty.

Fixes PR9043.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204776 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
test/SemaCXX/warn-address.cpp [new file with mode: 0644]

index 8066ed5a3ea717bb0cd8f7b061f72b763e9da4ad..5df740fa950ed55ccf75266dd54df5a64440c77b 100644 (file)
@@ -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
index 105974b6c14b111a76daa65f057b8ca5a5f102c3..13ad527d6ccc315b39435440d0eba185cb9b8b42 100644 (file)
@@ -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<BoolConversion>;
+    InGroup<PointerBoolConversion>;
 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<DiagGroup<"string-compare">>;
+  InGroup<StringCompare>;
 
 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 (file)
index 0000000..219edfd
--- /dev/null
@@ -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}}
+}