xref: /llvm-project/clang/lib/AST/ExprConstShared.h (revision 80c15c48d1fbb53478c9400e598abcbdcae0d962)
1 //===--- ExprConstShared.h - Shared consetxpr functionality ----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Shared functionality between the new constant expression
10 // interpreter (AST/ByteCode/) and the current one (ExprConstant.cpp).
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_CLANG_LIB_AST_EXPRCONSTSHARED_H
15 #define LLVM_CLANG_LIB_AST_EXPRCONSTSHARED_H
16 
17 #include "clang/Basic/TypeTraits.h"
18 
19 namespace llvm {
20 class APFloat;
21 }
22 namespace clang {
23 class QualType;
24 class LangOptions;
25 class ASTContext;
26 class CharUnits;
27 class Expr;
28 } // namespace clang
29 using namespace clang;
30 /// Values returned by __builtin_classify_type, chosen to match the values
31 /// produced by GCC's builtin.
32 enum class GCCTypeClass {
33   None = -1,
34   Void = 0,
35   Integer = 1,
36   // GCC reserves 2 for character types, but instead classifies them as
37   // integers.
38   Enum = 3,
39   Bool = 4,
40   Pointer = 5,
41   // GCC reserves 6 for references, but appears to never use it (because
42   // expressions never have reference type, presumably).
43   PointerToDataMember = 7,
44   RealFloat = 8,
45   Complex = 9,
46   // GCC reserves 10 for functions, but does not use it since GCC version 6 due
47   // to decay to pointer. (Prior to version 6 it was only used in C++ mode).
48   // GCC claims to reserve 11 for pointers to member functions, but *actually*
49   // uses 12 for that purpose, same as for a class or struct. Maybe it
50   // internally implements a pointer to member as a struct?  Who knows.
51   PointerToMemberFunction = 12, // Not a bug, see above.
52   ClassOrStruct = 12,
53   Union = 13,
54   // GCC reserves 14 for arrays, but does not use it since GCC version 6 due to
55   // decay to pointer. (Prior to version 6 it was only used in C++ mode).
56   // GCC reserves 15 for strings, but actually uses 5 (pointer) for string
57   // literals.
58   // Lang = 16,
59   // OpaqueType = 17,
60   BitInt = 18,
61   Vector = 19
62 };
63 
64 GCCTypeClass EvaluateBuiltinClassifyType(QualType T,
65                                          const LangOptions &LangOpts);
66 
67 void HandleComplexComplexMul(llvm::APFloat A, llvm::APFloat B, llvm::APFloat C,
68                              llvm::APFloat D, llvm::APFloat &ResR,
69                              llvm::APFloat &ResI);
70 void HandleComplexComplexDiv(llvm::APFloat A, llvm::APFloat B, llvm::APFloat C,
71                              llvm::APFloat D, llvm::APFloat &ResR,
72                              llvm::APFloat &ResI);
73 
74 CharUnits GetAlignOfExpr(const ASTContext &Ctx, const Expr *E,
75                          UnaryExprOrTypeTrait ExprKind);
76 
77 #endif
78