1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-21 21:52:10 +02:00

Add __builtin_is_constant_evaluated

This commit is contained in:
Igor V. Kovalenko 2023-03-14 19:23:55 +03:00 committed by Jonah Graham
parent 3fdea6e31a
commit f768aed976
3 changed files with 19 additions and 1 deletions

View file

@ -13888,4 +13888,10 @@ public class AST2CPPTests extends AST2CPPTestBase {
BindingAssertionHelper helper = getAssertionHelper();
helper.assertVariableValue("shiftpack", 3);
}
// constexpr auto true_value = __builtin_is_constant_evaluated();
public void testBuiltinIsConstantEvaluated() throws Exception {
BindingAssertionHelper helper = getAssertionHelper();
helper.assertVariableValue("true_value", 1);
}
}

View file

@ -226,6 +226,7 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider {
ICPPExecution builtinClz = new ExecBuiltin(ExecBuiltin.BUILTIN_CLZ);
ICPPExecution builtinClzl = new ExecBuiltin(ExecBuiltin.BUILTIN_CLZL);
ICPPExecution builtinClzll = new ExecBuiltin(ExecBuiltin.BUILTIN_CLZLL);
ICPPExecution builtinIsConstantEvaluated = new ExecBuiltin(ExecBuiltin.BUILTIN_IS_CONSTANT_EVALUATED);
// Other Builtins (https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html) [incomplete]
function("void", "__builtin_abort");
@ -358,6 +359,9 @@ public class GCCBuiltinSymbolProvider implements IBuiltinBindingsProvider {
function("_Decimal128", "__builtin_infd128");
function("float", "__builtin_inff");
function("long double", "__builtin_infl");
if (fCpp) {
function("bool", "__builtin_is_constant_evaluated", builtinIsConstantEvaluated);
}
function("int", "__builtin_isinf_sign", "...");
function("bool", "__builtin_isfinite", "double");
function("bool", "__builtin_isgreater", "float", "float");

View file

@ -37,7 +37,7 @@ public class ExecBuiltin implements ICPPExecution {
BUILTIN_CTZLL = 5, BUILTIN_POPCOUNT = 6, BUILTIN_POPCOUNTL = 7, BUILTIN_POPCOUNTLL = 8, BUILTIN_PARITY = 9,
BUILTIN_PARITYL = 10, BUILTIN_PARITYLL = 11, BUILTIN_ABS = 12, BUILTIN_LABS = 13, BUILTIN_LLABS = 14,
BUILTIN_CLRSB = 15, BUILTIN_CLRSBL = 16, BUILTIN_CLRSBLL = 17, BUILTIN_CLZ = 18, BUILTIN_CLZL = 19,
BUILTIN_CLZLL = 20;
BUILTIN_CLZLL = 20, BUILTIN_IS_CONSTANT_EVALUATED = 21;
private static IType intType = new CPPBasicType(Kind.eInt, 0);
private static IType longType = new CPPBasicType(Kind.eInt, CPPBasicType.IS_LONG);
@ -100,6 +100,8 @@ public class ExecBuiltin implements ICPPExecution {
return executeBuiltinClz(record, context, longType);
case BUILTIN_CLZLL:
return executeBuiltinClz(record, context, longlongType);
case BUILTIN_IS_CONSTANT_EVALUATED:
return executeBuiltinIsConstantEvaluated(record, context, null);
}
return null;
}
@ -264,6 +266,12 @@ public class ExecBuiltin implements ICPPExecution {
return new ExecReturn(new EvalFixed(intType, ValueCategory.PRVALUE, IntegralValue.create(result)));
}
private ICPPExecution executeBuiltinIsConstantEvaluated(ActivationRecord record, ConstexprEvaluationContext context,
IType argType) {
// Since this is only evaluated in constexpr evaluation context, return true
return new ExecReturn(new EvalFixed(intType, ValueCategory.PRVALUE, IntegralValue.create(1)));
}
@Override
public void marshal(ITypeMarshalBuffer buffer, boolean includeValue) throws CoreException {
buffer.putShort(ITypeMarshalBuffer.EXEC_BUILTIN);