/* Date Stamp */ -d"_lint_co_gcc_lnt=co-gcc.lnt modified 12-Jun-2014"
/* To document usage use: -message( "Using " _lint_co_gcc_lnt ) */
// ---------------------------------------------------------------------
// This file is provided by Gimpel Software (www.gimpel.com) for use with
// its products PC-lint and FlexeLint.
//
// Redistribution and use of this file, with or without modification, is
// permitted provided that any such redistribution retains this notice.
// ---------------------------------------------------------------------
/*  co-gcc.lnt: This is the seed file for configuring Lint for use with
    GCC versions 2.95.3 and later.

    Like all compiler options files this file is intended to be used
    as follows:

         lint co-gcc.lnt source-files-to-be-linted

    Some of the information that co-gcc.lnt requires needs to be furnished
    with the help of the gcc system itself.  The easiest way to generate
    this information is to use the makefile co-gcc.mak (supplied with the
    Lint distribution) in an invocation of GNU Make; for details, see the
    commentary at the top of co-gcc.mak.
*/

-cgnu             // Notifies FlexeLint that gcc is being used.

// ===========================
// Preprocessor Configuration:
+fdi // GCC starts its #include search in the directory of the including
     // file.

++fln  // Allow:
       //   # digit-sequence " [s-char-sequence] " new-line
       // as a synonym for:
       //   # line digit-sequence " [s-char-sequence] " new-line
       // GCC additionally allows flag values to follow the
       // s-char-sequence, but currently Lint ignores them.

-header(co-gcc.h) // Includes headers generated by GCC (bringing in
                  // predefined macros).
+libh(co-gcc.h)   // Marks that header as library code.

gcc-include-path.lnt // This .lnt file should contain --i options
     // and should be generated by invoking gcc with its '-v' option.
     // (GCC's implicit #include search path is presented in the output.)
     // This happens automatically when 'make -f co-gcc.mak' is invoked.

// Assertion directives (a feature of GCC's preprocessor) have been
// considered obsolete in GCC's documentation since version 3.0, so we do
// not use them here.  If support for #assert is needed in the form of a
// lint option, one may use '-a#' like so:
// -a#machine(i386)  // #assert's machine(i386)  (SVR4 facility).

// File extensions:
// From the GCC man page:
//
//      file.cc
//      file.cp
//      file.cxx
//      file.cpp
//      file.CPP
//      file.c++
//      file.C
//          C++ source code that must be preprocessed.  Note that in .cxx, the
//          last two letters must both be literally x.  Likewise, .C refers to
//          a literal capital C.
//
// We emulate this with:

    +cpp(.cc)
    +cpp(.cp)
    +cpp(.cxx)
    +cpp(.cpp)
    +cpp(.c++)
    // Note the exceptions:
        // +cpp(.CPP)
        // +cpp(.C)
    // These are commented out for the default config because they seem to
    // cause trouble more often than not.  For starters, it is problematic
    // with filesystems that are case-insensitive (which has become common
    // even on some POSIX systems).

// =============
// Size Options:
//  +fwc // wchar_t might be builtin; if so, uncomment this option. (NOTE:
//       // this option needs to be set before a size option is given for
//       // wchar_t; see the documentation for -sw# in the Lint manual.)

size-options.lnt // This .lnt file should be generated (preferrably
     // by a program created by invoking GCC with the compile options that
     // are used in the compilation of the project to be linted).  This
     // happens automatically when 'make -f co-gcc.mak' is invoked.


// ===========================================
// +rw and -d options to cope with GNU syntax:
+ppw(ident)                 // Tolerate #ident
+ppw(warning)

// GCC provides alternative spellings of certain keywords:
+rw(__inline)
-rw_asgn(__inline__,__inline)
-rw_asgn(__header_always_inline,__inline)
-rw_asgn(__header_inline,__inline)

-rw_asgn(__signed__,signed)
-rw_asgn(__signed,signed)
-rw_asgn( __volatile__, volatile )
-rw_asgn( __volatile, volatile )
+rw(restrict)
-rw_asgn(__restrict,restrict)
-rw_asgn(__restrict__,restrict)
++d"__const=const"        // gconv.h uses __const rather than const
++d"const=const"          // ensure const expands to const.

-rw_asgn( asm,      _up_to_brackets )
-rw_asgn( __asm,    _up_to_brackets )
-rw_asgn( __asm__,  _up_to_brackets )
// This re-definition of the various spellings of the asm keyword enables
// Lint to pass gracefully over expression-statements like:
// __asm __volatile ("fsqrt" : "=t" (__result) : "0" (__x));
// But it may be necessary to suppress certain error messages that are
// triggered by tokens that are part of an assembly declaration or
// statement.  For example:

    -d"__asm__(p...)=/*lint -e{19}*/ __asm__(p)"

// ...causes Lint to be quiet about the semicolon that follows an
// __asm__() declaration.  Note, the -e{N} form of suppression takes
// effect only for the forward-declaration, definition or
// [possibly-compound] statement that immediately follows.  Because a
// semicolon is seen as a declaration-terminator, Error 19 will be
// re-enabled immediately after the semicolon in '__asm__(...);'.
// (The elipsis after the macro parameter p allows zero or more commas to
// appear in the operand.)
//
// If you encounter other diagnostics that appear to need suppression in
// or near assembly regions, please let us know!
//
-esym(123,__asm__)

-rw_asgn(__alignof__,__alignof)

// "__extension__" is GCC's way of allowing the use of non-standard
// constructs in a strict Standard-conforming mode.  We don't currently
// have explicit support for it, but we can use local suppressions.  For
// example, we can use -e(160) so that we will not see any Errors about
// GNU statement-expressions wrapped in __extension__().
++d"__extension__=/*lint -e(160) */"

++d"__null=0"
+rw(_to_semi)           // needed for the two macros above.
+rw(__typeof__)         // activate __typeof__ keyword
-d"__typeof=__typeof__"   // an alternative to using __typeof__

-rw(__except)           // This MS reserved word is used as an identifier
+rw( __complex__, __real__, __imag__ )  // reserved words that can be ignored.
++d"__builtin_strchr=(char*)"     // permits the inline definition ...
++d"__builtin_strpbrk=(char*)"    // of these functions to be linted ...
++d"__builtin_strrchr=(char*)"    // without drawing a complaint
++d"__builtin_strstr=(char*)"     // about the use of a non-standard name
++d"__PRETTY_FUNCTION__=___function___" // lint defines ___function___ internally
++d"__FUNCTION__=___function___"        // lint defines ___function___ internally
++d"__func__=___function___"  // Some C++ modes suport the implicit __func__
                            // identifier.
-ident($)

// =========================================================
// Other options supporting GNU C/C++ syntax:
+fld // enables the processing of _L_abel _D_esignators E.g.:
     // union { double d; int i; } u = { d: 3.141  };

// =========================================================
// Generally useful suppressions:
-wlib(1)      // sets the warning level within library headers to 1
              // (no warnings, just syntax errors).  Comment out if you
              // are actually linting library headers.
-elib(123)    // 123 is really a warning, but it's in the "Error" range.
-elib(93)     // allow newlines within quoted string arguments to macros
-elib(46)     // allow bit fields to have integral types other than
              // '_Bool' and 'int'.
-elibsym(628) // Suppress 628 for __builtin symbols.

-esym(528,__huge_val,__nan,__qnan,__qnanf,__snan,__snanf)
                       // We don't care if we don't reference some GNU functions
-esym(528,__gnu_malloc,__gnu_calloc)

//  The following functions exhibit variable return modes.
//  That is, they may equally-usefully be called for a value
//  as called just for their effects.  Accordingly we inhibit
//  Warning 534 for these functions.
//  Feel free to add to or subtract from this list.

-esym(534,close,creat,fclose,fprintf,fputc)
-esym(534,fputs,fscanf,fseek,fwrite,lseek,memcpy,memmove,memset)
-esym(534,printf,puts,scanf,sprintf,sscanf,strcat,strcpy)
-esym(534,strncat,strncpy,unlink,write)

// For non-ANSI compilers we suppress messages 515 and 516
// for functions known to have variable argument lists.
// For ANSI compilers, header files should take care of this.

-esym(515,fprintf,printf,sprintf,fscanf,scanf,sscanf)
-esym(516,fprintf,printf,sprintf,fscanf,scanf,sscanf)
-esym(1702,*operator<<,*operator>>)
-esym(534,*operator<<,*operator>>)
-esym(1055,*__builtin*)
-esym(718,*__builtin*)   // The compiler does not need these ...
-esym(746,*__builtin*)   // declared and it knows their prototypes.
