// bsla_unused.h                                                      -*-C++-*-
#ifndef INCLUDED_BSLA_UNUSED
#define INCLUDED_BSLA_UNUSED

#include <bsls_ident.h>
BSLS_IDENT("$Id: $")

//@PURPOSE: Provide a macro to suppress "unused" warnings.
//
//@DEPRECATED: Use 'bsla_maybeunused' instead.
//
//@MACROS:
//  BSLA_UNUSED: do not warn if annotated entity is unused
//  BSLA_UNUSED_IS_ACTIVE: 0 if 'BSLA_UNUSED' expands to nothing, else 1
//
//@SEE_ALSO: bsla_annotations, bsla_maybeunused
//
//@DESCRIPTION: This component provides a preprocessor macro that will suppress
// "unused" warnings on a locally defined function, type, or variable that is
// not used.
//
// Note that the similar macro, 'BSLA_MAYBE_UNUSED', aliasing the standard
// '[[maybe_unused]]' attribute, may be considered for use instead of this
// macro.
//
///Macro Reference
///---------------
//: 'BSLA_UNUSED':
//:    This annotation indicates that the so-annotated function, variable, or
//:    type is possibly unused and the compiler should not generate a warning
//:    for the unused identifier.
//:
//: 'BSLA_UNUSED_IS_ACTIVE':
//:    The macro 'BSLA_UNUSED_IS_ACTIVE' is defined to 0 if 'BSLA_UNUSED'
//:    expands to nothing and 1 otherwise.
//
///Usage
///-----
// This section illustrates intended use of this component.
//
///Example 1: "Unused" Warnings
/// - - - - - - - - - - - - - -
// First, we define a namespace, 'warn', within the unnamed namespace with a
// type, a function, and a variable in it.  They are unused:
//..
//  namespace {
//  namespace warn {
//
//  double x;
//
//  struct ResultRec {
//      double d_x;
//      double d_y;
//  };
//
//  int quadratic(double *zeroA,
//                double *zeroB,
//                double *zeroC,
//                double cubeFactor,
//                double a,
//                double b,
//                double c)
//      // Solve the quadratic function for the specified 'a', 'b', and 'c',
//      // where '0 = a * x^2 + b * x + c'.  If the quadratic has no solutions,
//      // return a non-zero value, and set the specified 'zeroA' and 'zeroB'
//      // to those solutions and return 0 otherwise.  The specified
//      // 'cubeFactor' and 'zeroC' are unused for now but will be used in
//      // future expansion of the function to handle cubic polynomials.
//  {
//      const double discriminant = b * b - 4 * a * c;
//      if (discriminant < 0 || 0.0 == a) {
//          *zeroA = *zeroB = 0.0;
//          return -1;                                                // RETURN
//      }
//
//      const double root = ::sqrt(discriminant);
//      *zeroA = (-b + root) / (2 * a);
//      *zeroB = (-b - root) / (2 * a);
//
//      return 0;
//  }
//
//  }  // close namespace warn
//  }  // close unnamed namespace
//..
// Then, we observe the warnings:
//..
//  .../bsla_unused.t.cpp:135:27: warning: unused parameter 'zeroC'
//  [-Wunused-parameter]
//                 double *zeroC,
//                 ~~~~~~~~^~~~~
//  .../bsla_unused.t.cpp:136:26: warning: unused parameter 'cubeFactor'
//  [-Wunused-parameter]
//                 double cubeFactor,
//                 ~~~~~~~^~~~~~~~~~
//  .../bsla_unused.t.cpp:133:9: warning: 'int {anonymous}::warn::
//  quadratic(double*, double*, double*, double, double, double, double)'
//  defined but not used [-Wunused-function]
//   int quadratic(double *zeroA,
//       ^~~~~~~~~
//  .../bsla_unused.t.cpp:126:12: warning: '{anonymous}::warn::x' defined but
//  not used [-Wunused-variable]
//   double x;
//          ^
//..
// Note that none of the compilers currently in use by the development team
// issue a warning on the unused 'warn::ResultRec', but some in the future
// might.  In the meantime, 'BSLA_UNUSED' is tolerated on type declarations
// without resulting in a syntax error.
//
// Next, we define a namespace, 'nowarn', within the unused namespace with
// exactly the same unused entities, using the 'BSLA_UNUSED' annotation to
// silence the warnings:
//..
//  namespace {
//  namespace nowarn {
//
//  struct ResultRec {
//      double d_x;
//      double d_y;
//  } BSLA_UNUSED;
//
//  double x BSLA_UNUSED;
//
//  int quadratic(double             *zeroA,
//                double             *zeroB,
//                BSLA_UNUSED double *zeroC,
//                BSLA_UNUSED double  cubeFactor,
//                double              a,
//                double              b,
//                double              c) BSLA_UNUSED;
//      // Solve the quadratic function for the specified 'a', 'b', and 'c',
//      // where '0 = a * x^2 + b * x + c'.  If the quadratic has no solutions,
//      // return a non-zero value, and set the specified 'zeroA' and 'zeroB'
//      // to those solutions and return 0 otherwise.  The specified
//      // 'cubeFactor' and 'zeroC' are unused for now but will be used in
//      // future expansion of the function to handle cubic polynomials.
//
//  int quadratic(double             *zeroA,
//                double             *zeroB,
//                BSLA_UNUSED double *zeroC,
//                BSLA_UNUSED double  cubeFactor,
//                double              a,
//                double              b,
//                double              c)
//  {
//      const double discriminant = b * b - 4 * a * c;
//      if (discriminant < 0 || 0.0 == a) {
//          *zeroA = *zeroB = 0.0;
//          return -1;                                                // RETURN
//      }
//
//      const double root = ::sqrt(discriminant);
//      *zeroA = (-b + root) / (2 * a);
//      *zeroB = (-b - root) / (2 * a);
//
//      return 0;
//  }
//
//  }  // close namespace nowarn
//  }  // close unnamed namespace
//..
// Finally, we observe that the warnings for the 'nowarn' namespace are
// suppressed.

#include <bsls_platform.h>

// Note that it is highly recommended to use 'BSLA_MAYBE_UNUSED'
// ('[[maybe_unused]]') where available, as it is supported by a large number
// of platforms, but that has more specific constraints over where it can be
// syntactically placed than the older vendor annotations.

#if defined(BSLS_PLATFORM_CMP_GNU) || defined(BSLS_PLATFORM_CMP_CLANG)
    #define BSLA_UNUSED     __attribute__((__unused__))

    #define BSLA_UNUSED_IS_ACTIVE 1
#else
    #define BSLA_UNUSED

    #define BSLA_UNUSED_IS_ACTIVE 0
#endif

#endif

// ----------------------------------------------------------------------------
// Copyright 2019 Bloomberg Finance L.P.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------------------- END-OF-FILE ----------------------------------