Modify ALLOW_UNUSED to allow enabling unused local warnings on MSVC.

This splits the macro into two:

int a = 1;
ALLOW_UNUSED_LOCAL(a);

and

typedef Foo Bar ALLOW_UNUSED_TYPE;
void foo() ALLOW_UNUSED_TYPE;  // ALLOW_UNUSED_TYPE_OR_FUNC seemed too verbose

This matches changes that have already been made in Blink.

BUG=81439
TEST=none
TBR=ben

Review URL: https://codereview.chromium.org/650393002

Cr-Commit-Position: refs/heads/master@{#300014}
diff --git a/base/compiler_specific.h b/base/compiler_specific.h
index ba57cc3..6210d1a 100644
--- a/base/compiler_specific.h
+++ b/base/compiler_specific.h
@@ -94,11 +94,17 @@
 // (Typically used to silence a compiler warning when the assignment
 // is important for some other reason.)
 // Use like:
-//   int x ALLOW_UNUSED = ...;
+//   int x = ...;
+//   ALLOW_UNUSED_LOCAL(x);
+#define ALLOW_UNUSED_LOCAL(x) false ? (void)x : (void)0
+
+// Annotate a typedef or function indicating it's ok if it's not used.
+// Use like:
+//   typedef Foo Bar ALLOW_UNUSED_TYPE;
 #if defined(COMPILER_GCC)
-#define ALLOW_UNUSED __attribute__((unused))
+#define ALLOW_UNUSED_TYPE __attribute__((unused))
 #else
-#define ALLOW_UNUSED
+#define ALLOW_UNUSED_TYPE
 #endif
 
 // Annotate a function indicating it should not be inlined.
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc
index 6ebe32e4..95a16f2 100644
--- a/base/logging_unittest.cc
+++ b/base/logging_unittest.cc
@@ -240,7 +240,8 @@
 // looking in the global namespace.
 namespace nested_test {
   class Streamable {};
-  ALLOW_UNUSED std::ostream& operator<<(std::ostream& out, const Streamable&) {
+  ALLOW_UNUSED_TYPE std::ostream& operator<<(std::ostream& out,
+                                             const Streamable&) {
     return out << "Streamable";
   }
   TEST_F(LoggingTest, StreamingWstringFindsCorrectOperator) {
diff --git a/base/mac/foundation_util_unittest.mm b/base/mac/foundation_util_unittest.mm
index 916a13b..e60a0f6 100644
--- a/base/mac/foundation_util_unittest.mm
+++ b/base/mac/foundation_util_unittest.mm
@@ -331,12 +331,12 @@
 #endif  // defined(ARCH_CPU_64_BITS)
 
   NSInteger some_nsinteger;
-  FormatNSIntegerAsType* pointer_to_some_nsinteger ALLOW_UNUSED =
-      &some_nsinteger;
+  FormatNSIntegerAsType* pointer_to_some_nsinteger = &some_nsinteger;
+  ALLOW_UNUSED_LOCAL(pointer_to_some_nsinteger);
 
   NSUInteger some_nsuinteger;
-  FormatNSUIntegerAsType* pointer_to_some_nsuinteger ALLOW_UNUSED =
-      &some_nsuinteger;
+  FormatNSUIntegerAsType* pointer_to_some_nsuinteger = &some_nsuinteger;
+  ALLOW_UNUSED_LOCAL(pointer_to_some_nsuinteger);
 
   // Check that format specifier works correctly for NSInteger.
   const struct {
diff --git a/base/tuple_unittest.cc b/base/tuple_unittest.cc
index 402394cb6..8d620de 100644
--- a/base/tuple_unittest.cc
+++ b/base/tuple_unittest.cc
@@ -30,7 +30,8 @@
 }  // namespace
 
 TEST(TupleTest, Basic) {
-  Tuple0 t0 ALLOW_UNUSED = MakeTuple();
+  Tuple0 t0 = MakeTuple();
+  ALLOW_UNUSED_LOCAL(t0);
   Tuple1<int> t1(1);
   Tuple2<int, const char*> t2 = MakeTuple(1, static_cast<const char*>("wee"));
   Tuple3<int, int, int> t3(1, 2, 3);
diff --git a/cc/quads/draw_quad_unittest.cc b/cc/quads/draw_quad_unittest.cc
index 308f0842..1d09307 100644
--- a/cc/quads/draw_quad_unittest.cc
+++ b/cc/quads/draw_quad_unittest.cc
@@ -105,14 +105,17 @@
 #define QUAD_DATA \
     gfx::Rect quad_rect(30, 40, 50, 60); \
     gfx::Rect quad_visible_rect(40, 50, 30, 20); \
-    gfx::Rect ALLOW_UNUSED quad_opaque_rect(60, 55, 10, 10); \
-    bool ALLOW_UNUSED needs_blending = true;
+    gfx::Rect quad_opaque_rect( 60, 55, 10, 10); \
+    ALLOW_UNUSED_LOCAL(quad_opaque_rect); \
+    bool needs_blending = true; \
+    ALLOW_UNUSED_LOCAL(needs_blending);
 
 #define SETUP_AND_COPY_QUAD_NEW(Type, quad)                                \
   DrawQuad* copy_new =                                                     \
       render_pass->CopyFromAndAppendDrawQuad(quad_new, copy_shared_state); \
   CompareDrawQuad(quad_new, copy_new, copy_shared_state);                  \
-  const Type* ALLOW_UNUSED copy_quad = Type::MaterialCast(copy_new);
+  const Type* copy_quad = Type::MaterialCast(copy_new);                    \
+  ALLOW_UNUSED_LOCAL(copy_quad);
 
 #define SETUP_AND_COPY_QUAD_ALL(Type, quad)                                \
   DrawQuad* copy_all =                                                     \
@@ -124,7 +127,8 @@
   DrawQuad* copy_new = render_pass->CopyFromAndAppendRenderPassDrawQuad( \
       quad_new, copy_shared_state, a);                                   \
   CompareDrawQuad(quad_new, copy_new, copy_shared_state);                \
-  const Type* ALLOW_UNUSED copy_quad = Type::MaterialCast(copy_new);
+  const Type* copy_quad = Type::MaterialCast(copy_new);                  \
+  ALLOW_UNUSED_LOCAL(copy_quad);
 
 #define SETUP_AND_COPY_QUAD_ALL_RP(Type, quad, a)                        \
   DrawQuad* copy_all = render_pass->CopyFromAndAppendRenderPassDrawQuad( \
diff --git a/ipc/ipc_message_macros.h b/ipc/ipc_message_macros.h
index e38ef28..0978765 100644
--- a/ipc/ipc_message_macros.h
+++ b/ipc/ipc_message_macros.h
@@ -892,7 +892,7 @@
 
 #define IPC_BEGIN_MESSAGE_MAP(class_name, msg) \
   { \
-    typedef class_name _IpcMessageHandlerClass ALLOW_UNUSED; \
+    typedef class_name _IpcMessageHandlerClass ALLOW_UNUSED_TYPE; \
     void* param__ = NULL; \
     const IPC::Message& ipc_message__ = msg; \
     switch (ipc_message__.type()) {
@@ -905,11 +905,11 @@
 #define IPC_DECLTYPE typeof
 #endif
 
-#define IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(class_name, msg, param) \
-  {                                                              \
-    typedef class_name _IpcMessageHandlerClass ALLOW_UNUSED;     \
-    IPC_DECLTYPE(param) param__ = param;                         \
-    const IPC::Message& ipc_message__ = msg;                     \
+#define IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(class_name, msg, param)  \
+  {                                                               \
+    typedef class_name _IpcMessageHandlerClass ALLOW_UNUSED_TYPE; \
+    IPC_DECLTYPE(param) param__ = param;                          \
+    const IPC::Message& ipc_message__ = msg;                      \
     switch (ipc_message__.type()) {
 
 #define IPC_MESSAGE_FORWARD(msg_class, obj, member_func)                       \
diff --git a/ppapi/proxy/dispatch_reply_message.h b/ppapi/proxy/dispatch_reply_message.h
index 56a45089..bb4b7d7 100644
--- a/ppapi/proxy/dispatch_reply_message.h
+++ b/ppapi/proxy/dispatch_reply_message.h
@@ -134,7 +134,7 @@
 // unused variables or other errors if they're used with these macros.
 #define PPAPI_BEGIN_MESSAGE_MAP(class_name, msg) \
   { \
-    typedef class_name _IpcMessageHandlerClass ALLOW_UNUSED; \
+    typedef class_name _IpcMessageHandlerClass ALLOW_UNUSED_TYPE; \
     const IPC::Message& ipc_message__ = msg; \
     switch (ipc_message__.type()) { \
 
diff --git a/ui/gl/generate_bindings.py b/ui/gl/generate_bindings.py
index 303c01eb..b135cac 100755
--- a/ui/gl/generate_bindings.py
+++ b/ui/gl/generate_bindings.py
@@ -1521,9 +1521,10 @@
   # on the extension string or the GL version.
   file.write("""void Driver%s::InitializeDynamicBindings(GLContext* context) {
   DCHECK(context && context->IsCurrent(NULL));
-  const GLVersionInfo* ver ALLOW_UNUSED = context->GetVersionInfo();
-  std::string extensions ALLOW_UNUSED = context->GetExtensions();
-  extensions += " ";
+  const GLVersionInfo* ver = context->GetVersionInfo();
+  ALLOW_UNUSED_LOCAL(ver);
+  std::string extensions = context->GetExtensions() + " ";
+  ALLOW_UNUSED_LOCAL(extensions);
 
 """ % set_name.upper())
   for extension in sorted(used_extensions):