diff options
Diffstat (limited to 'clang/tools')
| -rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 10 | ||||
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 39 | ||||
| -rw-r--r-- | clang/tools/libclang/libclang.exports | 3 |
3 files changed, 47 insertions, 5 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 2878ba26aff..de87351059f 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -2462,8 +2462,14 @@ static void display_evaluate_results(CXEvalResult result) { switch (clang_EvalResult_getKind(result)) { case CXEval_Int: { - int val = clang_EvalResult_getAsInt(result); - printf("Kind: Int , Value: %d", val); + printf("Kind: Int, "); + if (clang_EvalResult_isUnsignedInt(result)) { + unsigned long long val = clang_EvalResult_getAsUnsigned(result); + printf("unsigned, Value: %llu", val); + } else { + long long val = clang_EvalResult_getAsLongLong(result); + printf("Value: %lld", val); + } break; } case CXEval_Float: diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 4ed6b0ecea1..72eb4018490 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -3518,10 +3518,12 @@ static StringLiteral* getCFSTR_value(CallExpr *callExpr) { struct ExprEvalResult { CXEvalResultKind EvalType; union { - int intVal; + unsigned long long unsignedVal; + long long intVal; double floatVal; char *stringVal; } EvalData; + bool IsUnsignedInt; ~ExprEvalResult() { if (EvalType != CXEval_UnExposed && EvalType != CXEval_Float && EvalType != CXEval_Int) { @@ -3542,10 +3544,32 @@ CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E) { } int clang_EvalResult_getAsInt(CXEvalResult E) { + return clang_EvalResult_getAsLongLong(E); +} + +long long clang_EvalResult_getAsLongLong(CXEvalResult E) { + if (!E) { + return 0; + } + ExprEvalResult *Result = (ExprEvalResult*)E; + if (Result->IsUnsignedInt) + return Result->EvalData.unsignedVal; + return Result->EvalData.intVal; +} + +unsigned clang_EvalResult_isUnsignedInt(CXEvalResult E) { + return ((ExprEvalResult *)E)->IsUnsignedInt; +} + +unsigned long long clang_EvalResult_getAsUnsigned(CXEvalResult E) { if (!E) { return 0; } - return ((ExprEvalResult *)E)->EvalData.intVal; + + ExprEvalResult *Result = (ExprEvalResult*)E; + if (Result->IsUnsignedInt) + return Result->EvalData.unsignedVal; + return Result->EvalData.intVal; } double clang_EvalResult_getAsDouble(CXEvalResult E) { @@ -3576,10 +3600,19 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) { CallExpr *callExpr; auto result = llvm::make_unique<ExprEvalResult>(); result->EvalType = CXEval_UnExposed; + result->IsUnsignedInt = false; if (ER.Val.isInt()) { result->EvalType = CXEval_Int; - result->EvalData.intVal = ER.Val.getInt().getExtValue(); + + auto& val = ER.Val.getInt(); + if (val.isUnsigned()) { + result->IsUnsignedInt = true; + result->EvalData.unsignedVal = val.getZExtValue(); + } else { + result->EvalData.intVal = val.getExtValue(); + } + return result.release(); } diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index 6df933a61e6..222cb678395 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -335,6 +335,9 @@ clang_Cursor_hasAttrs clang_Cursor_Evaluate clang_EvalResult_getKind clang_EvalResult_getAsInt +clang_EvalResult_getAsLongLong +clang_EvalResult_getAsUnsigned +clang_EvalResult_isUnsignedInt clang_EvalResult_getAsDouble clang_EvalResult_getAsStr clang_EvalResult_dispose |

