| [a32b204] | 1 | // | 
|---|
|  | 2 | // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo | 
|---|
|  | 3 | // | 
|---|
|  | 4 | // The contents of this file are covered under the licence agreement in the | 
|---|
|  | 5 | // file "LICENCE" distributed with Cforall. | 
|---|
|  | 6 | // | 
|---|
| [c92bdcc] | 7 | // ConversionCost.cpp -- | 
|---|
| [a32b204] | 8 | // | 
|---|
|  | 9 | // Author           : Richard C. Bilson | 
|---|
|  | 10 | // Created On       : Sun May 17 07:06:19 2015 | 
|---|
| [fb2bde4] | 11 | // Last Modified By : Andrew Beach | 
|---|
| [1d17939] | 12 | // Last Modified On : Wed Jul 29 16:11:00 2020 | 
|---|
| [cf32116] | 13 | // Update Count     : 28 | 
|---|
| [a32b204] | 14 | // | 
|---|
| [51b73452] | 15 |  | 
|---|
| [c92bdcc] | 16 | #include "ConversionCost.hpp" | 
|---|
| [ea6332d] | 17 |  | 
|---|
|  | 18 | #include <cassert>                       // for assert | 
|---|
|  | 19 | #include <list>                          // for list, list<>::const_iterator | 
|---|
|  | 20 | #include <string>                        // for operator==, string | 
|---|
|  | 21 |  | 
|---|
| [c92bdcc] | 22 | #include "ResolvExpr/Cost.hpp"           // for Cost | 
|---|
|  | 23 | #include "ResolvExpr/Unify.hpp"          // for typesCompatibleIgnoreQualifiers | 
|---|
| [5bf3976] | 24 | #include "ResolvExpr/PtrsAssignable.hpp" // for ptrsAssignable | 
|---|
| [ef1da0e2] | 25 |  | 
|---|
| [51b73452] | 26 | namespace ResolvExpr { | 
|---|
| [b46e3bd] | 27 |  | 
|---|
| [5ccb10d] | 28 | #if 0 | 
|---|
|  | 29 | #define PRINT(x) x | 
|---|
|  | 30 | #else | 
|---|
|  | 31 | #define PRINT(x) | 
|---|
|  | 32 | #endif | 
|---|
| [ada4575] | 33 |  | 
|---|
| [13de4478] | 34 | namespace { | 
|---|
|  | 35 |  | 
|---|
| [e15853c] | 36 | // GENERATED START, DO NOT EDIT | 
|---|
| [b2ea0cd] | 37 | // GENERATED BY BasicTypes-gen.cpp | 
|---|
| [cdcddfe1] | 38 | /* EXTENDED INTEGRAL RANK HIERARCHY (root to leaves) | 
|---|
| [e15853c] | 39 | _Bool | 
|---|
| [7870799] | 40 | char                signed char         unsigned char | 
|---|
|  | 41 | signed short int         unsigned short int | 
|---|
|  | 42 | signed int               unsigned int | 
|---|
|  | 43 | signed long int          unsigned long int | 
|---|
|  | 44 | signed long long int     unsigned long long int | 
|---|
|  | 45 | __int128                 unsigned __int128 | 
|---|
|  | 46 | _Float16                 _Float16 _Complex | 
|---|
|  | 47 | _Float32                 _Float32 _Complex | 
|---|
|  | 48 | float                    float _Complex | 
|---|
|  | 49 | _Float32x                _Float32x _Complex | 
|---|
|  | 50 | _Float64                 _Float64 _Complex | 
|---|
|  | 51 | double                   double _Complex | 
|---|
|  | 52 | _Float64x                _Float64x _Complex | 
|---|
| [e15853c] | 53 | __float80 | 
|---|
| [7870799] | 54 | _Float128                _Float128 _Complex | 
|---|
| [e15853c] | 55 | __float128 | 
|---|
| [7870799] | 56 | long double              long double _Complex | 
|---|
|  | 57 | _Float128x               _Float128x _Complex | 
|---|
| [cdcddfe1] | 58 | */ | 
|---|
| [e15853c] | 59 | // GENERATED END | 
|---|
| [cdcddfe1] | 60 |  | 
|---|
| [e15853c] | 61 | // GENERATED START, DO NOT EDIT | 
|---|
| [b2ea0cd] | 62 | // GENERATED BY BasicTypes-gen.cpp | 
|---|
| [7a780ad] | 63 | static const int costMatrix[ast::BasicKind::NUMBER_OF_BASIC_TYPES][ast::BasicKind::NUMBER_OF_BASIC_TYPES] = { // path length from root to node | 
|---|
| [3a55d9f] | 64 | /*               B    C   SC   UC   SI  SUI    I   UI   LI  LUI  LLI LLUI   IB  UIB  _FH  _FH   _F  _FC    F   FC  _FX _FXC   FD _FDC    D   DC F80X_FDXC  F80  _FB_FLDC   FB   LD  LDC _FBX_FLDXC */ | 
|---|
|  | 65 | /*      B */ {   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  15,  15,  16,  17,  16,  18,  17, }, | 
|---|
|  | 66 | /*      C */ {  -1,   0,   1,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  15,  16,  15,  17,  16, }, | 
|---|
|  | 67 | /*     SC */ {  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  15,  16,  15,  17,  16, }, | 
|---|
|  | 68 | /*     UC */ {  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  14,  15,  16,  15,  17,  16, }, | 
|---|
|  | 69 | /*     SI */ {  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  15,  14,  16,  15, }, | 
|---|
|  | 70 | /*    SUI */ {  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  13,  14,  15,  14,  16,  15, }, | 
|---|
|  | 71 | /*      I */ {  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  14,  13,  15,  14, }, | 
|---|
|  | 72 | /*     UI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  12,  13,  14,  13,  15,  14, }, | 
|---|
|  | 73 | /*     LI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  13,  12,  14,  13, }, | 
|---|
|  | 74 | /*    LUI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  11,  12,  13,  12,  14,  13, }, | 
|---|
|  | 75 | /*    LLI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  12,  11,  13,  12, }, | 
|---|
|  | 76 | /*   LLUI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  10,  11,  12,  11,  13,  12, }, | 
|---|
|  | 77 | /*     IB */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  11,  10,  12,  11, }, | 
|---|
|  | 78 | /*    UIB */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,   9,  10,  11,  10,  12,  11, }, | 
|---|
|  | 79 | /*    _FH */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   8,   9,  10,   9,  11,  10, }, | 
|---|
|  | 80 | /*    _FH */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,   3,  -1,   4,  -1,   5,  -1,   6,  -1,  -1,   7,  -1,  -1,   8,  -1,   9, }, | 
|---|
|  | 81 | /*     _F */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8,   9,   8,  10,   9, }, | 
|---|
|  | 82 | /*    _FC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,   3,  -1,   4,  -1,   5,  -1,  -1,   6,  -1,  -1,   7,  -1,   8, }, | 
|---|
|  | 83 | /*      F */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   6,   7,   8,   7,   9,   8, }, | 
|---|
|  | 84 | /*     FC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,   3,  -1,   4,  -1,  -1,   5,  -1,  -1,   6,  -1,   7, }, | 
|---|
|  | 85 | /*    _FX */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   5,   6,   7,   6,   8,   7, }, | 
|---|
|  | 86 | /*   _FXC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,   3,  -1,  -1,   4,  -1,  -1,   5,  -1,   6, }, | 
|---|
|  | 87 | /*     FD */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   4,   5,   6,   5,   7,   6, }, | 
|---|
|  | 88 | /*   _FDC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,   2,  -1,  -1,   3,  -1,  -1,   4,  -1,   5, }, | 
|---|
|  | 89 | /*      D */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3,   4,   5,   4,   6,   5, }, | 
|---|
|  | 90 | /*     DC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1,  -1,  -1,   2,  -1,  -1,   3,  -1,   4, }, | 
|---|
|  | 91 | /*   F80X */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   4,   3,   5,   4, }, | 
|---|
|  | 92 | /*  _FDXC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,  -1,   1,  -1,  -1,   2,  -1,   3, }, | 
|---|
|  | 93 | /*    F80 */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   1,   0,   1,   2,   2,   3,   3,   4,   4, }, | 
|---|
|  | 94 | /*    _FB */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2,   2,   3,   3, }, | 
|---|
|  | 95 | /*  _FLDC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,  -1,   1,  -1,   2, }, | 
|---|
|  | 96 | /*     FB */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   1,   0,   1,   2,   2,   3, }, | 
|---|
|  | 97 | /*     LD */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   1,   2, }, | 
|---|
|  | 98 | /*    LDC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   1, }, | 
|---|
|  | 99 | /*   _FBX */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1, }, | 
|---|
| [ef5b828] | 100 | /* _FLDXC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0, }, | 
|---|
| [e15853c] | 101 | }; // costMatrix | 
|---|
| [1c9568f0] | 102 | static const int maxIntCost = 15; | 
|---|
| [e15853c] | 103 | // GENERATED END | 
|---|
| [cdcddfe1] | 104 | static_assert( | 
|---|
| [7a780ad] | 105 | sizeof(costMatrix)/sizeof(costMatrix[0][0]) == ast::BasicKind::NUMBER_OF_BASIC_TYPES * ast::BasicKind::NUMBER_OF_BASIC_TYPES, | 
|---|
| [cdcddfe1] | 106 | "Missing row in the cost matrix" | 
|---|
|  | 107 | ); | 
|---|
|  | 108 |  | 
|---|
| [e15853c] | 109 | // GENERATED START, DO NOT EDIT | 
|---|
| [b2ea0cd] | 110 | // GENERATED BY BasicTypes-gen.cpp | 
|---|
| [7a780ad] | 111 | static const int signMatrix[ast::BasicKind::NUMBER_OF_BASIC_TYPES][ast::BasicKind::NUMBER_OF_BASIC_TYPES] = { // number of sign changes in safe conversion | 
|---|
| [3a55d9f] | 112 | /*               B    C   SC   UC   SI  SUI    I   UI   LI  LUI  LLI LLUI   IB  UIB  _FH  _FH   _F  _FC    F   FC  _FX _FXC   FD _FDC    D   DC F80X_FDXC  F80  _FB_FLDC   FB   LD  LDC _FBX_FLDXC */ | 
|---|
|  | 113 | /*      B */ {   0,   0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 114 | /*      C */ {  -1,   0,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 115 | /*     SC */ {  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 116 | /*     UC */ {  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 117 | /*     SI */ {  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 118 | /*    SUI */ {  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 119 | /*      I */ {  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 120 | /*     UI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 121 | /*     LI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 122 | /*    LUI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 123 | /*    LLI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 124 | /*   LLUI */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 125 | /*     IB */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 126 | /*    UIB */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 127 | /*    _FH */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 128 | /*    _FH */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, }, | 
|---|
|  | 129 | /*     _F */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 130 | /*    _FC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, }, | 
|---|
|  | 131 | /*      F */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 132 | /*     FC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, }, | 
|---|
|  | 133 | /*    _FX */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 134 | /*   _FXC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, }, | 
|---|
|  | 135 | /*     FD */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 136 | /*   _FDC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, }, | 
|---|
|  | 137 | /*      D */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 138 | /*     DC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, }, | 
|---|
|  | 139 | /*   F80X */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 140 | /*  _FDXC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, }, | 
|---|
|  | 141 | /*    F80 */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 142 | /*    _FB */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 143 | /*  _FLDC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,  -1,   0,  -1,   0, }, | 
|---|
|  | 144 | /*     FB */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0,   0,   0, }, | 
|---|
|  | 145 | /*     LD */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0,   0,   0, }, | 
|---|
|  | 146 | /*    LDC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,  -1,   0, }, | 
|---|
|  | 147 | /*   _FBX */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0,   0, }, | 
|---|
| [ef5b828] | 148 | /* _FLDXC */ {  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,   0, }, | 
|---|
| [e15853c] | 149 | }; // signMatrix | 
|---|
|  | 150 | // GENERATED END | 
|---|
| [cdcddfe1] | 151 | static_assert( | 
|---|
| [7a780ad] | 152 | sizeof(signMatrix)/sizeof(signMatrix[0][0]) == ast::BasicKind::NUMBER_OF_BASIC_TYPES * ast::BasicKind::NUMBER_OF_BASIC_TYPES, | 
|---|
| [cdcddfe1] | 153 | "Missing row in the sign matrix" | 
|---|
|  | 154 | ); | 
|---|
| [a32b204] | 155 |  | 
|---|
| [cf32116] | 156 | int localPtrsAssignable(const ast::Type * t1, const ast::Type * t2, | 
|---|
|  | 157 | const ast::SymbolTable &, const ast::TypeEnvironment & env ) { | 
|---|
|  | 158 | return ptrsAssignable( t1, t2, env ); | 
|---|
|  | 159 | } | 
|---|
| [fb2bde4] | 160 | } | 
|---|
|  | 161 |  | 
|---|
|  | 162 | Cost conversionCost( | 
|---|
| [cf32116] | 163 | const ast::Type * src, const ast::Type * dst, bool srcIsLvalue, | 
|---|
| [d3aa55e9] | 164 | const ast::SymbolTable & symtab, const ast::TypeEnvironment & env | 
|---|
| [fb2bde4] | 165 | ) { | 
|---|
|  | 166 | if ( const ast::TypeInstType * inst = dynamic_cast< const ast::TypeInstType * >( dst ) ) { | 
|---|
| [3e5dd913] | 167 | if ( const ast::EqvClass * eqv = env.lookup( *inst ) ) { | 
|---|
| [fb2bde4] | 168 | if ( eqv->bound ) { | 
|---|
| [cf32116] | 169 | return conversionCost(src, eqv->bound, srcIsLvalue, symtab, env ); | 
|---|
| [fb2bde4] | 170 | } else { | 
|---|
|  | 171 | return Cost::infinity; | 
|---|
|  | 172 | } | 
|---|
|  | 173 | } else if ( const ast::NamedTypeDecl * named = symtab.lookupType( inst->name ) ) { | 
|---|
|  | 174 | const ast::TypeDecl * type = dynamic_cast< const ast::TypeDecl * >( named ); | 
|---|
|  | 175 | assertf( type, "Unexpected typedef." ); | 
|---|
|  | 176 | if ( type->base ) { | 
|---|
| [cf32116] | 177 | return conversionCost( src, type->base, srcIsLvalue, symtab, env ) + Cost::safe; | 
|---|
| [fb2bde4] | 178 | } | 
|---|
|  | 179 | } | 
|---|
|  | 180 | } | 
|---|
| [251ce80] | 181 | if ( typesCompatibleIgnoreQualifiers( src, dst, env ) ) { | 
|---|
| [9d5089e] | 182 | return Cost::zero; | 
|---|
| [fb2bde4] | 183 | } else if ( dynamic_cast< const ast::VoidType * >( dst ) ) { | 
|---|
|  | 184 | return Cost::safe; | 
|---|
|  | 185 | } else if ( const ast::ReferenceType * refType = | 
|---|
|  | 186 | dynamic_cast< const ast::ReferenceType * >( dst ) ) { | 
|---|
| [cf32116] | 187 | return convertToReferenceCost( src, refType, srcIsLvalue, symtab, env, localPtrsAssignable ); | 
|---|
| [fb2bde4] | 188 | } else { | 
|---|
| [0bd3faf] | 189 | return ast::Pass<ConversionCost>::read( src, dst, srcIsLvalue, symtab, env, conversionCost ); | 
|---|
| [fb2bde4] | 190 | } | 
|---|
|  | 191 | } | 
|---|
|  | 192 |  | 
|---|
| [85855b0] | 193 | Cost enumCastCost ( | 
|---|
| [a7efc96] | 194 | const ast::EnumInstType * src, const ast::EnumInstType * dst, | 
|---|
| [85855b0] | 195 | const ast::SymbolTable & symtab, const ast::TypeEnvironment & env | 
|---|
|  | 196 | ); | 
|---|
|  | 197 |  | 
|---|
| [cf32116] | 198 | static Cost convertToReferenceCost( const ast::Type * src, const ast::Type * dst, bool srcIsLvalue, | 
|---|
| [0f19f5e5] | 199 | int diff, const ast::SymbolTable & symtab, const ast::TypeEnvironment & env, | 
|---|
| [cf32116] | 200 | PtrsCalculation func ) { | 
|---|
| [fb2bde4] | 201 | if ( 0 < diff ) { | 
|---|
|  | 202 | Cost cost = convertToReferenceCost( | 
|---|
| [cf32116] | 203 | strict_dynamic_cast< const ast::ReferenceType * >( src )->base, dst, | 
|---|
|  | 204 | srcIsLvalue, (diff - 1), symtab, env, func ); | 
|---|
| [fb2bde4] | 205 | cost.incReference(); | 
|---|
|  | 206 | return cost; | 
|---|
|  | 207 | } else if ( diff < -1 ) { | 
|---|
|  | 208 | Cost cost = convertToReferenceCost( | 
|---|
|  | 209 | src, strict_dynamic_cast< const ast::ReferenceType * >( dst )->base, | 
|---|
| [cf32116] | 210 | srcIsLvalue, (diff + 1), symtab, env, func ); | 
|---|
| [fb2bde4] | 211 | cost.incReference(); | 
|---|
|  | 212 | return cost; | 
|---|
|  | 213 | } else if ( 0 == diff ) { | 
|---|
|  | 214 | const ast::ReferenceType * srcAsRef = dynamic_cast< const ast::ReferenceType * >( src ); | 
|---|
|  | 215 | const ast::ReferenceType * dstAsRef = dynamic_cast< const ast::ReferenceType * >( dst ); | 
|---|
|  | 216 | if ( srcAsRef && dstAsRef ) { | 
|---|
|  | 217 | ast::CV::Qualifiers tq1 = srcAsRef->base->qualifiers; | 
|---|
|  | 218 | ast::CV::Qualifiers tq2 = dstAsRef->base->qualifiers; | 
|---|
|  | 219 | if ( tq1 <= tq2 && typesCompatibleIgnoreQualifiers( | 
|---|
| [251ce80] | 220 | srcAsRef->base, dstAsRef->base, env ) ) { | 
|---|
| [fb2bde4] | 221 | if ( tq1 == tq2 ) { | 
|---|
|  | 222 | return Cost::zero; | 
|---|
|  | 223 | } else { | 
|---|
|  | 224 | return Cost::safe; | 
|---|
|  | 225 | } | 
|---|
|  | 226 | } else { | 
|---|
|  | 227 | int assignResult = func( srcAsRef->base, dstAsRef->base, symtab, env ); | 
|---|
|  | 228 | if ( 0 < assignResult ) { | 
|---|
|  | 229 | return Cost::safe; | 
|---|
|  | 230 | } else if ( assignResult < 0 ) { | 
|---|
|  | 231 | return Cost::unsafe; | 
|---|
|  | 232 | } | 
|---|
|  | 233 | } | 
|---|
|  | 234 | } else { | 
|---|
| [0bd3faf] | 235 | return ast::Pass<ConversionCost>::read( src, dst, srcIsLvalue, symtab, env, conversionCost ); | 
|---|
| [fb2bde4] | 236 | } | 
|---|
| [5ccc733] | 237 | if (const ast::EnumInstType * srcAsInst = dynamic_cast< const ast::EnumInstType * >( src )) { | 
|---|
|  | 238 | if (srcAsInst->base && !srcAsInst->base->isCfa) { | 
|---|
|  | 239 | static const ast::BasicType* integer = new ast::BasicType( ast::BasicKind::UnsignedInt ); | 
|---|
|  | 240 | return ast::Pass<ConversionCost>::read( integer, dst, srcIsLvalue, symtab, env, conversionCost ); | 
|---|
|  | 241 | } | 
|---|
|  | 242 | } | 
|---|
| [fb2bde4] | 243 | } else { | 
|---|
|  | 244 | assert( -1 == diff ); | 
|---|
|  | 245 | const ast::ReferenceType * dstAsRef = dynamic_cast< const ast::ReferenceType * >( dst ); | 
|---|
|  | 246 | assert( dstAsRef ); | 
|---|
| [5ccc733] | 247 | auto dstBaseType = dstAsRef->base; | 
|---|
|  | 248 | const ast::Type * newSrc = src; | 
|---|
|  | 249 | if ( dynamic_cast< const ast::EnumInstType * >( src ) && dstBaseType.as<ast::BasicType>() ) { | 
|---|
|  | 250 | newSrc = new ast::BasicType( ast::BasicKind::UnsignedInt ); | 
|---|
|  | 251 | } | 
|---|
| [00f89a6] | 252 | if (dstAsRef->base->is_const() ) { | 
|---|
|  | 253 | auto cvtCost = conversionCost(newSrc, dstAsRef->base, srcIsLvalue, symtab, env) ; | 
|---|
|  | 254 | if (cvtCost == Cost::zero) { // exact match, may use a lvalue src | 
|---|
|  | 255 | if ( srcIsLvalue ) { | 
|---|
|  | 256 | if ( src->qualifiers == dstAsRef->base->qualifiers ) { | 
|---|
|  | 257 | return Cost::reference; | 
|---|
|  | 258 | } else if ( src->qualifiers < dstAsRef->base->qualifiers ) { | 
|---|
|  | 259 | return Cost::safe; | 
|---|
|  | 260 | } else { | 
|---|
|  | 261 | return Cost::unsafe; | 
|---|
|  | 262 | } | 
|---|
|  | 263 | } | 
|---|
|  | 264 | else { | 
|---|
|  | 265 | return Cost::reference; | 
|---|
|  | 266 | } | 
|---|
|  | 267 | } | 
|---|
|  | 268 | else { // not exact match, conversion is needed so lvalueness of src does not matter | 
|---|
|  | 269 | return cvtCost + Cost::reference; | 
|---|
|  | 270 | } | 
|---|
|  | 271 | } | 
|---|
| [5ccc733] | 272 | if ( typesCompatibleIgnoreQualifiers( newSrc, dstAsRef->base, env ) ) { | 
|---|
| [cf32116] | 273 | if ( srcIsLvalue ) { | 
|---|
| [fb2bde4] | 274 | if ( src->qualifiers == dstAsRef->base->qualifiers ) { | 
|---|
|  | 275 | return Cost::reference; | 
|---|
|  | 276 | } else if ( src->qualifiers < dstAsRef->base->qualifiers ) { | 
|---|
|  | 277 | return Cost::safe; | 
|---|
|  | 278 | } else { | 
|---|
|  | 279 | return Cost::unsafe; | 
|---|
|  | 280 | } | 
|---|
| [00f89a6] | 281 | } else { // rvalue-to-NC-ref conversion | 
|---|
| [fb2bde4] | 282 | return Cost::unsafe; | 
|---|
|  | 283 | } | 
|---|
|  | 284 | } | 
|---|
|  | 285 | } | 
|---|
|  | 286 | return Cost::infinity; | 
|---|
|  | 287 | } | 
|---|
|  | 288 |  | 
|---|
|  | 289 | Cost convertToReferenceCost( const ast::Type * src, const ast::ReferenceType * dst, | 
|---|
| [cf32116] | 290 | bool srcIsLvalue, const ast::SymbolTable & symtab, const ast::TypeEnvironment & env, | 
|---|
|  | 291 | PtrsCalculation func ) { | 
|---|
| [fb2bde4] | 292 | int sdepth = src->referenceDepth(), ddepth = dst->referenceDepth(); | 
|---|
| [cf32116] | 293 | return convertToReferenceCost( src, dst, srcIsLvalue, sdepth - ddepth, symtab, env, func ); | 
|---|
| [fb2bde4] | 294 | } | 
|---|
|  | 295 |  | 
|---|
| [0bd3faf] | 296 | void ConversionCost::postvisit( const ast::VoidType * voidType ) { | 
|---|
| [fb2bde4] | 297 | (void)voidType; | 
|---|
|  | 298 | cost = Cost::infinity; | 
|---|
|  | 299 | } | 
|---|
|  | 300 |  | 
|---|
| [0bd3faf] | 301 | void ConversionCost::conversionCostFromBasicToBasic( const ast::BasicType * src, const ast::BasicType* dest ) { | 
|---|
| [fc134a48] | 302 | int tableResult = costMatrix[ src->kind ][ dest->kind ]; | 
|---|
|  | 303 | if ( tableResult == -1 ) { | 
|---|
|  | 304 | cost = Cost::unsafe; | 
|---|
|  | 305 | } else { | 
|---|
|  | 306 | cost = Cost::zero; | 
|---|
|  | 307 | cost.incSafe( tableResult ); | 
|---|
|  | 308 | cost.incSign( signMatrix[ src->kind ][ dest->kind ] ); | 
|---|
|  | 309 | } | 
|---|
|  | 310 | } | 
|---|
|  | 311 |  | 
|---|
| [0bd3faf] | 312 | void ConversionCost::postvisit( const ast::BasicType * basicType ) { | 
|---|
| [fb2bde4] | 313 | if ( const ast::BasicType * dstAsBasic = dynamic_cast< const ast::BasicType * >( dst ) ) { | 
|---|
| [fc134a48] | 314 | conversionCostFromBasicToBasic( basicType, dstAsBasic ); | 
|---|
| [d3aa55e9] | 315 | } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { | 
|---|
| [5ccc733] | 316 | if ( dstAsEnumInst->base && !dstAsEnumInst->base->isCfa ) { | 
|---|
|  | 317 | cost = Cost::safe; | 
|---|
| [af746cc] | 318 | } | 
|---|
| [fb2bde4] | 319 | } | 
|---|
|  | 320 | } | 
|---|
|  | 321 |  | 
|---|
| [0bd3faf] | 322 | void ConversionCost::postvisit( const ast::PointerType * pointerType ) { | 
|---|
| [fb2bde4] | 323 | if ( const ast::PointerType * dstAsPtr = dynamic_cast< const ast::PointerType * >( dst ) ) { | 
|---|
|  | 324 | ast::CV::Qualifiers tq1 = pointerType->base->qualifiers; | 
|---|
|  | 325 | ast::CV::Qualifiers tq2 = dstAsPtr->base->qualifiers; | 
|---|
|  | 326 | if ( tq1 <= tq2 && typesCompatibleIgnoreQualifiers( | 
|---|
| [251ce80] | 327 | pointerType->base, dstAsPtr->base, env ) ) { | 
|---|
| [fb2bde4] | 328 | if ( tq1 == tq2 ) { | 
|---|
|  | 329 | cost = Cost::zero; | 
|---|
|  | 330 | } else { | 
|---|
|  | 331 | cost = Cost::safe; | 
|---|
|  | 332 | } | 
|---|
| [ef1da0e2] | 333 | } | 
|---|
|  | 334 | /* | 
|---|
|  | 335 | else if ( const ast::FunctionType * dstFunc = dstAsPtr->base.as<ast::FunctionType>()) { | 
|---|
|  | 336 | if (const ast::FunctionType * srcFunc = pointerType->base.as<ast::FunctionType>()) { | 
|---|
|  | 337 | if (dstFunc->params.empty() && dstFunc->isVarArgs ) { | 
|---|
|  | 338 | cost = Cost::unsafe; // assign any function to variadic fptr | 
|---|
|  | 339 | } | 
|---|
|  | 340 | } | 
|---|
|  | 341 | else { | 
|---|
|  | 342 | ast::AssertionSet need, have; // unused | 
|---|
|  | 343 | ast::OpenVarSet open; | 
|---|
|  | 344 | env.extractOpenVars(open); | 
|---|
|  | 345 | ast::TypeEnvironment tenv = env; | 
|---|
|  | 346 | if ( unify(dstAsPtr->base, pointerType->base, tenv, need, have, open, symtab) ) { | 
|---|
|  | 347 | cost = Cost::safe; | 
|---|
|  | 348 | } | 
|---|
|  | 349 | } | 
|---|
|  | 350 | // else infinity | 
|---|
|  | 351 | } | 
|---|
|  | 352 | */ | 
|---|
|  | 353 | else { | 
|---|
| [fb2bde4] | 354 | int assignResult = ptrsAssignable( pointerType->base, dstAsPtr->base, env ); | 
|---|
|  | 355 | if ( 0 < assignResult && tq1 <= tq2 ) { | 
|---|
|  | 356 | if ( tq1 == tq2 ) { | 
|---|
|  | 357 | cost = Cost::safe; | 
|---|
|  | 358 | } else { | 
|---|
|  | 359 | cost = Cost::safe + Cost::safe; | 
|---|
|  | 360 | } | 
|---|
|  | 361 | } else if ( assignResult < 0 ) { | 
|---|
|  | 362 | cost = Cost::unsafe; | 
|---|
|  | 363 | } // else Cost::infinity | 
|---|
|  | 364 | } | 
|---|
|  | 365 | } | 
|---|
|  | 366 | } | 
|---|
|  | 367 |  | 
|---|
| [0bd3faf] | 368 | void ConversionCost::postvisit( const ast::ArrayType * arrayType ) { | 
|---|
| [fb2bde4] | 369 | (void)arrayType; | 
|---|
|  | 370 | } | 
|---|
|  | 371 |  | 
|---|
| [0bd3faf] | 372 | void ConversionCost::postvisit( const ast::ReferenceType * refType ) { | 
|---|
| [fb2bde4] | 373 | assert( nullptr == dynamic_cast< const ast::ReferenceType * >( dst ) ); | 
|---|
|  | 374 |  | 
|---|
| [cf32116] | 375 | cost = costCalc( refType->base, dst, srcIsLvalue, symtab, env ); | 
|---|
| [46da46b] | 376 |  | 
|---|
|  | 377 | // xxx - should qualifiers be considered in pass-by-value? | 
|---|
|  | 378 | /* | 
|---|
| [fb2bde4] | 379 | if ( refType->base->qualifiers == dst->qualifiers ) { | 
|---|
|  | 380 | cost.incReference(); | 
|---|
|  | 381 | } else if ( refType->base->qualifiers < dst->qualifiers ) { | 
|---|
|  | 382 | cost.incSafe(); | 
|---|
|  | 383 | } else { | 
|---|
|  | 384 | cost.incUnsafe(); | 
|---|
|  | 385 | } | 
|---|
| [46da46b] | 386 | */ | 
|---|
|  | 387 | cost.incReference(); | 
|---|
| [fb2bde4] | 388 | } | 
|---|
|  | 389 |  | 
|---|
| [0bd3faf] | 390 | void ConversionCost::postvisit( const ast::FunctionType * functionType ) { | 
|---|
| [fb2bde4] | 391 | (void)functionType; | 
|---|
|  | 392 | } | 
|---|
|  | 393 |  | 
|---|
| [af746cc] | 394 | void ConversionCost::postvisit( const ast::EnumInstType * inst ) { | 
|---|
| [85855b0] | 395 | if ( auto dstInst = dynamic_cast<const ast::EnumInstType *>( dst ) ) { | 
|---|
|  | 396 | cost = enumCastCost(inst, dstInst, symtab, env); | 
|---|
| [5ccc733] | 397 | } else if ( !inst->base->isCfa ) { | 
|---|
| [d3aa55e9] | 398 | static ast::ptr<ast::BasicType> integer = { new ast::BasicType( ast::BasicKind::SignedInt ) }; | 
|---|
|  | 399 | cost = costCalc( integer, dst, srcIsLvalue, symtab, env ); | 
|---|
| [fc1a3e2] | 400 | } | 
|---|
| [d3aa55e9] | 401 | // cost.incUnsafe(); | 
|---|
| [0522ebe] | 402 | } | 
|---|
|  | 403 |  | 
|---|
| [0bd3faf] | 404 | void ConversionCost::postvisit( const ast::TraitInstType * traitInstType ) { | 
|---|
| [fb2bde4] | 405 | (void)traitInstType; | 
|---|
|  | 406 | } | 
|---|
|  | 407 |  | 
|---|
| [0bd3faf] | 408 | void ConversionCost::postvisit( const ast::TypeInstType * typeInstType ) { | 
|---|
| [3e5dd913] | 409 | if ( const ast::EqvClass * eqv = env.lookup( *typeInstType ) ) { | 
|---|
| [cf32116] | 410 | cost = costCalc( eqv->bound, dst, srcIsLvalue, symtab, env ); | 
|---|
| [fb2bde4] | 411 | } else if ( const ast::TypeInstType * dstAsInst = | 
|---|
|  | 412 | dynamic_cast< const ast::TypeInstType * >( dst ) ) { | 
|---|
| [3e5dd913] | 413 | if ( *typeInstType == *dstAsInst ) { | 
|---|
| [fb2bde4] | 414 | cost = Cost::zero; | 
|---|
|  | 415 | } | 
|---|
|  | 416 | } else if ( const ast::NamedTypeDecl * namedType = symtab.lookupType( typeInstType->name ) ) { | 
|---|
|  | 417 | const ast::TypeDecl * type = dynamic_cast< const ast::TypeDecl * >( namedType ); | 
|---|
|  | 418 | assertf( type, "Unexpected typedef."); | 
|---|
|  | 419 | if ( type->base ) { | 
|---|
| [cf32116] | 420 | cost = costCalc( type->base, dst, srcIsLvalue, symtab, env ) + Cost::safe; | 
|---|
| [fb2bde4] | 421 | } | 
|---|
|  | 422 | } | 
|---|
|  | 423 | } | 
|---|
|  | 424 |  | 
|---|
| [0bd3faf] | 425 | void ConversionCost::postvisit( const ast::TupleType * tupleType ) { | 
|---|
| [fb2bde4] | 426 | Cost c = Cost::zero; | 
|---|
|  | 427 | if ( const ast::TupleType * dstAsTuple = dynamic_cast< const ast::TupleType * >( dst ) ) { | 
|---|
|  | 428 | auto srcIt = tupleType->types.begin(); | 
|---|
|  | 429 | auto dstIt = dstAsTuple->types.begin(); | 
|---|
|  | 430 | auto srcEnd = tupleType->types.end(); | 
|---|
|  | 431 | auto dstEnd = dstAsTuple->types.end(); | 
|---|
|  | 432 | while ( srcIt != srcEnd && dstIt != dstEnd ) { | 
|---|
| [cf32116] | 433 | Cost newCost = costCalc( * srcIt++, * dstIt++, srcIsLvalue, symtab, env ); | 
|---|
| [fb2bde4] | 434 | if ( newCost == Cost::infinity ) { | 
|---|
|  | 435 | return; | 
|---|
|  | 436 | } | 
|---|
|  | 437 | c += newCost; | 
|---|
|  | 438 | } | 
|---|
|  | 439 | if ( dstIt != dstEnd ) { | 
|---|
|  | 440 | cost = Cost::infinity; | 
|---|
|  | 441 | } else { | 
|---|
|  | 442 | cost = c; | 
|---|
|  | 443 | } | 
|---|
|  | 444 | } | 
|---|
|  | 445 | } | 
|---|
|  | 446 |  | 
|---|
| [0bd3faf] | 447 | void ConversionCost::postvisit( const ast::VarArgsType * varArgsType ) { | 
|---|
| [fb2bde4] | 448 | (void)varArgsType; | 
|---|
|  | 449 | if ( dynamic_cast< const ast::VarArgsType * >( dst ) ) { | 
|---|
|  | 450 | cost = Cost::zero; | 
|---|
|  | 451 | } | 
|---|
|  | 452 | } | 
|---|
|  | 453 |  | 
|---|
| [0bd3faf] | 454 | void ConversionCost::postvisit( const ast::ZeroType * zeroType ) { | 
|---|
| [fb2bde4] | 455 | (void)zeroType; | 
|---|
|  | 456 | if ( dynamic_cast< const ast::ZeroType * >( dst ) ) { | 
|---|
|  | 457 | cost = Cost::zero; | 
|---|
|  | 458 | } else if ( const ast::BasicType * dstAsBasic = | 
|---|
|  | 459 | dynamic_cast< const ast::BasicType * >( dst ) ) { | 
|---|
| [7a780ad] | 460 | int tableResult = costMatrix[ ast::BasicKind::SignedInt ][ dstAsBasic->kind ]; | 
|---|
| [fb2bde4] | 461 | if ( -1 == tableResult ) { | 
|---|
|  | 462 | cost = Cost::unsafe; | 
|---|
|  | 463 | } else { | 
|---|
|  | 464 | cost = Cost::zero; | 
|---|
|  | 465 | cost.incSafe( tableResult + 1 ); | 
|---|
| [7a780ad] | 466 | cost.incSign( signMatrix[ ast::BasicKind::SignedInt ][ dstAsBasic->kind ] ); | 
|---|
| [fb2bde4] | 467 | } | 
|---|
| [46da46b] | 468 | // this has the effect of letting any expr such as x+0, x+1 to be typed | 
|---|
|  | 469 | // the same as x, instead of at least int. are we willing to sacrifice this little | 
|---|
|  | 470 | // bit of coherence with C? | 
|---|
|  | 471 | // TODO: currently this does not work when no zero/one overloads exist. Find a fix for it. | 
|---|
|  | 472 | // cost = Cost::zero; | 
|---|
| [2f98fb2] | 473 | } else if ( dynamic_cast< const ast::PointerType * >( dst ) ) { | 
|---|
|  | 474 | cost = Cost::zero; | 
|---|
|  | 475 | // +1 for zero_t ->, +1 for disambiguation | 
|---|
|  | 476 | cost.incSafe( maxIntCost + 2 ); | 
|---|
| [46da46b] | 477 | // assuming 0p is supposed to be used for pointers? | 
|---|
| [af746cc] | 478 | } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { | 
|---|
| [5ccc733] | 479 | if ( dstAsEnumInst->base && !dstAsEnumInst->base->isCfa ) { | 
|---|
|  | 480 | cost = Cost::safe; | 
|---|
| [af746cc] | 481 | } | 
|---|
| [fb2bde4] | 482 | } | 
|---|
|  | 483 | } | 
|---|
|  | 484 |  | 
|---|
| [0bd3faf] | 485 | void ConversionCost::postvisit( const ast::OneType * oneType ) { | 
|---|
| [fb2bde4] | 486 | (void)oneType; | 
|---|
|  | 487 | if ( dynamic_cast< const ast::OneType * >( dst ) ) { | 
|---|
|  | 488 | cost = Cost::zero; | 
|---|
|  | 489 | } else if ( const ast::BasicType * dstAsBasic = | 
|---|
| [0bd3faf] | 490 | dynamic_cast< const ast::BasicType * >( dst ) ) { | 
|---|
| [7a780ad] | 491 | int tableResult = costMatrix[ ast::BasicKind::SignedInt ][ dstAsBasic->kind ]; | 
|---|
| [fb2bde4] | 492 | if ( -1 == tableResult ) { | 
|---|
|  | 493 | cost = Cost::unsafe; | 
|---|
|  | 494 | } else { | 
|---|
|  | 495 | cost = Cost::zero; | 
|---|
|  | 496 | cost.incSafe( tableResult + 1 ); | 
|---|
| [7a780ad] | 497 | cost.incSign( signMatrix[ ast::BasicKind::SignedInt ][ dstAsBasic->kind ] ); | 
|---|
| [fb2bde4] | 498 | } | 
|---|
| [af746cc] | 499 | } else if ( auto dstAsEnumInst = dynamic_cast< const ast::EnumInstType * >( dst ) ) { | 
|---|
| [5ccc733] | 500 | if ( dstAsEnumInst->base && !dstAsEnumInst->base->isCfa ) { | 
|---|
|  | 501 | cost = Cost::safe; | 
|---|
| [af746cc] | 502 | } | 
|---|
| [9d5089e] | 503 | } | 
|---|
| [fb2bde4] | 504 | } | 
|---|
| [0bd3faf] | 505 |  | 
|---|
| [85855b0] | 506 | // (dst) src is safe is src is a subtype of dst, or dst {inline src, ...} | 
|---|
|  | 507 | Cost enumCastCost ( | 
|---|
| [a7efc96] | 508 | const ast::EnumInstType * src, const ast::EnumInstType * dst, | 
|---|
| [85855b0] | 509 | const ast::SymbolTable & symtab, const ast::TypeEnvironment & env | 
|---|
|  | 510 | ) { | 
|---|
|  | 511 | auto srcDecl = src->base; | 
|---|
|  | 512 | auto dstDecl = dst->base; | 
|---|
|  | 513 | if (srcDecl->name == dstDecl->name) return Cost::safe; | 
|---|
|  | 514 | Cost minCost = Cost::infinity; | 
|---|
|  | 515 | for (auto child: dstDecl->inlinedDecl) { | 
|---|
|  | 516 | Cost c = enumCastCost(src, child, symtab, env) + Cost::safe; | 
|---|
|  | 517 | if (c<minCost) minCost = c; | 
|---|
|  | 518 | } | 
|---|
|  | 519 | return minCost; | 
|---|
|  | 520 | } | 
|---|
|  | 521 |  | 
|---|
|  | 522 |  | 
|---|
| [0bd3faf] | 523 | // size_t ConversionCost::traceId = Stats::Heap::new_stacktrace_id("ConversionCost"); | 
|---|
| [fb2bde4] | 524 |  | 
|---|
| [51b73452] | 525 | } // namespace ResolvExpr | 
|---|
| [a32b204] | 526 |  | 
|---|
|  | 527 | // Local Variables: // | 
|---|
|  | 528 | // tab-width: 4 // | 
|---|
|  | 529 | // mode: c++ // | 
|---|
|  | 530 | // compile-command: "make install" // | 
|---|
|  | 531 | // End: // | 
|---|