| // REQUIRES: host-supports-jit, host-supports-out-of-process-jit, x86_64-linux |
| |
| // RUN: cat %s | clang-repl -oop-executor -orc-runtime | FileCheck %s |
| |
| extern "C" int printf(const char *, ...); |
| |
| int intVar = 0; |
| double doubleVar = 3.14; |
| %undo |
| double doubleVar = 2.71; |
| |
| auto r1 = printf("intVar = %d\n", intVar); |
| // CHECK: intVar = 0 |
| auto r2 = printf("doubleVar = %.2f\n", doubleVar); |
| // CHECK: doubleVar = 2.71 |
| |
| // Test redefinition with inline and static functions. |
| int add(int a, int b, int c) { return a + b + c; } |
| %undo // Revert to the initial version of add |
| inline int add(int a, int b) { return a + b; } |
| |
| auto r3 = printf("add(1, 2) = %d\n", add(1, 2)); |
| // CHECK-NEXT: add(1, 2) = 3 |
| |
| // Test inline and lambda functions with variations. |
| inline int square(int x) { return x * x; } |
| auto lambdaSquare = [](int x) { return x * x; }; |
| auto lambdaMult = [](int a, int b) { return a * b; }; |
| |
| auto r4 = printf("square(4) = %d\n", square(4)); |
| // CHECK-NEXT: square(4) = 16 |
| auto lambda_r1 = printf("lambdaSquare(5) = %d\n", lambdaSquare(5)); |
| // CHECK-NEXT: lambdaSquare(5) = 25 |
| auto lambda_r2 = printf("lambdaMult(2, 3) = %d\n", lambdaMult(2, 3)); |
| // CHECK-NEXT: lambdaMult(2, 3) = 6 |
| |
| %undo // Undo previous lambda assignments |
| auto lambda_r3 = lambdaMult(3, 4); // Should fail or revert to the original lambda |
| |
| // Test weak and strong symbol linkage. |
| int __attribute__((weak)) weakFunc() { return 42; } |
| int strongFunc() { return 100; } |
| %undo // Revert the weak function |
| |
| auto r5 = printf("weakFunc() = %d\n", weakFunc()); |
| // CHECK: weakFunc() = 42 |
| auto r6 = printf("strongFunc() = %d\n", strongFunc()); |
| // CHECK-NEXT: strongFunc() = 100 |
| |
| // Weak variable linkage with different types. |
| int varA = 20; |
| static __typeof(varA) weakVarA __attribute__((__weakref__("varA"))); |
| char charVar = 'c'; |
| static __typeof(charVar) weakCharVar __attribute__((__weakref__("charVar"))); |
| auto r7 = printf("weakVarA = %d\n", weakVarA); |
| // CHECK: weakVarA = 20 |
| auto r8 = printf("weakCharVar = %c\n", weakCharVar); |
| // CHECK-NEXT: weakCharVar = c |
| |
| // Test complex lambdas with captures. |
| int captureVar = 5; |
| auto captureLambda = [](int x) { return x + captureVar; }; |
| int result1 = captureLambda(10); |
| %undo // Undo capture lambda |
| |
| auto r9 = printf("captureLambda(10) = %d\n", result1); |
| // CHECK: captureLambda(10) = 15 |
| |
| // Multiline statement test with arithmetic operations. |
| int sum = \ |
| 5 + \ |
| 10; |
| int prod = sum * 2; |
| auto r10 = printf("sum = %d, prod = %d\n", sum, prod); |
| // CHECK: sum = 15, prod = 30 |
| |
| // Test multiline functions and macro behavior. |
| #define MULTIPLY(a, b) ((a) * (b)) |
| |
| int complexFunc(int x) \ |
| { \ |
| return MULTIPLY(x, 2) + x; \ |
| } |
| |
| auto r11 = printf("complexFunc(5) = %d\n", complexFunc(5)); |
| // CHECK: complexFunc(5) = 15 |
| |
| %quit |