fnovload.h
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C头文件 代码 · 共 340 行 · 第 1/2 页
H
340 行
/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
* DESCRIBE IT HERE!
*
****************************************************************************/
#ifndef __FNOVLOAD_H__
#define __FNOVLOAD_H__
#define TypesSameFnov( t1, t2 ) \
TypesSameExclude( t1, t2, TC1_NOT_ENUM_CHAR | TC1_FUN_LINKAGE )
typedef enum // overload resolution results
{
#define __DEFINE_FNOVRESULT
#include "fnovrslt.h"
FNOV_INVALID
} FNOV_RESULT;
typedef enum // overload coarse ranks
{
#define __DEFINE_FNOVRANK
#include "fnovrank.h"
OV_RANK_INVALID
} FNOV_COARSE_RANK;
typedef enum
{ FNC_EXCLUDE_ELLIPSIS = 0x0001, // don't consider ellipsis
FNC_EXCLUDE_UDCONV = 0x0002, // don't consider u-d conversions
FNC_RANK_RETURN = 0x0004, // rank by return value
FNC_DISTINCT_CHECK = 0x0008, // distinct function checking
FNC_MEMBER = 0x0010, // member function ranking
FNC_EXCLUDE_DEFARG = 0x0020, // don't consider fns with def args
FNC_ONLY_SYM = 0x0040, // use only sym, not all of ring
FNC_TEMPLATE = 0x0080, // ring contains function template
FNC_STDOPS = 0x0100, // check for & on first arg
FNC_EXCLUDE_CONV = 0x0200, // no conversions allowed
FNC_RANKING_CTORS = 0x0400, // the functions being overloaded are ctors
FNC_8_5_3_ANSI = 0x0800,
FNC_STDOP_CV_VOID = 0x1000, // check cv-qual adjustments on stdop void
FNC_NO_DEALIAS = 0x2000, // don't dealias syms before overload
FNC_USE_WP13332 = 0x4000, // abide by wp13332 rules
FNC_DEFAULT = 0x0000 // default behaviour
} FNOV_CONTROL;
typedef enum
{
FNOV_UDC_CTOR = 0x01, // consider ctors
FNOV_UDC_UDCF = 0x02, // consider udcfs
FNOV_UDC_USE_EXPLICIT = 0x04, // use explicit ctors
FNOV_UDC_DIRECT = FNOV_UDC_CTOR | FNOV_UDC_USE_EXPLICIT,
// do direct initialization
FNOV_UDC_COPY = FNOV_UDC_CTOR | FNOV_UDC_UDCF,
} FNOV_UDC_CONTROL;
#define IsCopy( c ) ( ( c & FNOV_UDC_COPY ) == FNOV_UDC_COPY )
typedef enum
{
FNOV_INTRNL_NONE = 0x00, // no internal control bits
FNOV_INTRNL_ONCE_ONLY = 0x01, // only use UDC once
FNOV_INTRNL_DERIVED = 0x02, // src is derived from base
FNOV_INTRNL_EXCLUDE_UDCONV_PARAM = 0x04, // don't allow another udc on
// param (extension case)
FNOV_INTRNL_8_5_3_ANSI = 0x08, // do 8.5.3 ansi
FNOV_INTRNL_STDOP_CV_VOID = 0x10 // check cv-qual adjustments on stdop void
} FNOV_INTRNL_CONTROL; // for internal overloading use only
typedef struct {
unsigned udcnv; // # udcnv
unsigned standard; // # standard conversions
unsigned trivial : 1; // trivial conversion
unsigned promotion : 1; // promotion
unsigned not_exact : 1; // not an exact match
} FNOV_SCALAR;
typedef struct {
union {
FNOV_SCALAR no_ud; // no user-defined conversion
struct {
FNOV_SCALAR in; // on input to u-d conversion
FNOV_SCALAR out; // on output from u-d conversion
} ud; // user-defined conversion
} u;
FNOV_COARSE_RANK rank; // coarse rank
FNOV_CONTROL control; // how to perform ranking
unsigned userdef : 1; // use of user-defined conversion
} FNOV_RANK;
typedef struct func_list FNOV_LIST;
struct func_list {
FNOV_LIST *next; // next entry
SYMBOL sym; // associated symbol
FNOV_RANK *rankvector; // vector of ranks
arg_list *alist; // arguments
unsigned num_args; // number of arguments
type_flag flags; // flags for function
FNOV_RANK thisrank; // rank for this pointer
unsigned free_args : 1; // flag for mock arg list
unsigned member : 1; // flag for member function
unsigned stdops : 1; // flag for std operator
};
typedef struct {
FNOV_LIST *diag_ambig; // list of ambiguous functions
FNOV_LIST *diag_reject; // list of rejected functions
int num_candidates; // number of candidates found
} FNOV_DIAG;
void FnovArgRank( // RANK AN ARGUMENT LIST
TYPE src, // - source type
TYPE tgt, // - target type
PTREE *pt, // - addr[ argument ]
FNOV_RANK *rank ) // - ranking
;
boolean FnovCvFlagsRank( // RANK USING CV FLAGS
type_flag src, // - source type
type_flag tgt, // - target type
FNOV_RANK *rank ) // - ranking
;
void FnovDiagListsInit( // INITIALIZE DIAGNOSIS LISTS
void )
;
void SetFnovDiagnosticAmbigList( // SET DIAGNOSTIC LIST
FNOV_DIAG *fnov_diag, // diagnosis information
FNOV_LIST **ambig ) // - list of ambiguous entries
;
SYMBOL FnovGetAmbiguousEntry( // TRAVERSE LIST OF AMBIGUOUS SYMBOLS
FNOV_DIAG *fnov_diag, // - diagnosis information
FNOV_LIST **ptr ) // - list is not destroyed as it is traversed
// on first call *ptr == NULL
// on subsequent calls pass back same ptr
;
void FnovListFree( // FREE AN OVERLOAD LIST
FNOV_LIST **plist ) // - the list
;
void FnovMemFlagsRank( // RANK USING MEMORY FLAGS
type_flag src, // - source type
type_flag tgt, // - target type
void *srcbase, // - source base
void *tgtbase, // - target base
FNOV_RANK *rank ) // - ranking
;
SYMBOL FnovNextAmbiguousEntry( // TRAVERSE LIST OF AMBIGUOUS SYMBOLS
FNOV_DIAG *fnov_diag ) // - list is destroyed as it is traversed
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?