(expr)
| 700 | return None |
| 701 | |
| 702 | def getEssentialType(expr): |
| 703 | if not expr: |
| 704 | return None |
| 705 | |
| 706 | # See Appendix D, section D.6, Character constants |
| 707 | if expr.str[0] == "'" and expr.str[-1] == "'": |
| 708 | if len(expr.str) == 3 or (len(expr.str) == 4 and expr.str[1] == '\\'): |
| 709 | return 'char' |
| 710 | return '%s %s' % (expr.valueType.sign, expr.valueType.type) |
| 711 | |
| 712 | if expr.variable or isCast(expr): |
| 713 | typeToken = expr.variable.typeStartToken if expr.variable else expr.next |
| 714 | while typeToken and typeToken.isName: |
| 715 | if typeToken.str == 'char' and not typeToken.isSigned and not typeToken.isUnsigned: |
| 716 | return 'char' |
| 717 | typeToken = typeToken.next |
| 718 | if expr.valueType: |
| 719 | if expr.valueType.type == 'bool': |
| 720 | return 'bool' |
| 721 | if expr.valueType.isFloat(): |
| 722 | return expr.valueType.type |
| 723 | if expr.valueType.isIntegral(): |
| 724 | if (expr.valueType.sign is None) and expr.valueType.type == 'char': |
| 725 | return 'char' |
| 726 | return '%s %s' % (expr.valueType.sign, expr.valueType.type) |
| 727 | |
| 728 | elif expr.isNumber: |
| 729 | # Appendix D, D.6 The essential type of literal constants |
| 730 | # Integer constants |
| 731 | if expr.valueType.type == 'bool': |
| 732 | return 'bool' |
| 733 | if expr.valueType.isFloat(): |
| 734 | return expr.valueType.type |
| 735 | if expr.valueType.isIntegral(): |
| 736 | if expr.valueType.type != 'int': |
| 737 | return '%s %s' % (expr.valueType.sign, expr.valueType.type) |
| 738 | return get_essential_type_from_value(expr.getKnownIntValue(), expr.valueType.sign == 'signed') |
| 739 | |
| 740 | elif expr.str in ('<', '<=', '>=', '>', '==', '!=', '&&', '||', '!'): |
| 741 | return 'bool' |
| 742 | |
| 743 | elif expr.astOperand1 and expr.astOperand2 and expr.str in ( |
| 744 | '+', '-', '*', '/', '%', '&', '|', '^', '>>', "<<", "?", ":"): |
| 745 | if expr.astOperand1.valueType and expr.astOperand1.valueType.pointer > 0: |
| 746 | return None |
| 747 | if expr.astOperand2.valueType and expr.astOperand2.valueType.pointer > 0: |
| 748 | return None |
| 749 | e1 = getEssentialType(expr.astOperand1) |
| 750 | e2 = getEssentialType(expr.astOperand2) |
| 751 | if e1 is None or e2 is None: |
| 752 | return None |
| 753 | if is_constant_integer_expression(expr): |
| 754 | sign1 = e1.split(' ')[0] |
| 755 | sign2 = e2.split(' ')[0] |
| 756 | if sign1 == sign2 and sign1 in ('signed', 'unsigned'): |
| 757 | e = get_essential_type_from_value(expr.getKnownIntValue(), sign1 == 'signed') |
| 758 | if e: |
| 759 | return e |
no test coverage detected