I’m getting some weird errors from cling when I try to run a test script through it. The same code works just fine through cint. If I don’t uncomment any she-bangs, clang and gcc also compile it fine, and the binary works as expected.
Here’s the output from ./test.cpp and cling test.cpp when I uncomment the cling she-bang:
input_line_6:3:1: error: expected expression
public:
^
input_line_7:2:10: warning: empty parentheses interpreted as a function declaration [-Wvexing-parse]
int main()
^~
input_line_7:2:10: note: replace parentheses with an initializer to declare a variable
int main()
^~
= 0
input_line_8:3:6: error: variable has incomplete type 'Foo'
Foo f;
^
input_line_5:2:8: note: forward declaration of 'Foo'
class Foo
^
Additionally, if I comment the she-bang back out and run cling test.cpp, all I get is:
warning: cannot find function 'test()'; falling back to .L
What did I break, or is this a bug?
test.cpp:
//#! /usr/bin/cling
//#! /usr/bin/cint
#include <cstdio>
class Foo
{
public:
void bar()
{
printf("This is foobar'd\n");
}
};
int main()
{
Foo f;
printf("Hello World\n");
f.bar();
return 0;
}
//. allows you to keep the C++ code valid, and still make it interpretable. Optional.
The curlies need to go onto the same line to trigger continuation. That’s something we might get fixed once we overhaul how the pre-parsing works for cling - at the moment we’ll just send line by line to clang, and “class Foo” is not really helpful for clang…
to declare functions (again because of the code detection / pre-parsing issue) you’ll have to switch to .rawInput
don’t use main() - cling already has one
At the end I explicitly call the function to be called; as I said, each line is passed to the interpreter.
Hope that helps! For me, that produces:
Using raw input
Not using raw input
Hello World
This is foobar'd
Thanks, Axel. I appreciate the information. Also, that was actually fairly quick from what I’m used to on other forums, so no worries about the “late reply”.
Regarding #! ../obj/interpreter/llvm/obj/Debug+Asserts/bin/cling --metastr=//., will it still work if I instead do #! /usr/bin/cling --metastr=//.? I ask because I have no idea where your path is at, since it starts with “…”, which resolves to the parent directory. As I’m running the script from my home directory (/home/mark), that would resolve to /home/obj/interpreter/llvm/obj/Debug+Asserts/bin/cling, which does not exist. lol
If it not, below is an attached list of the files owned by the cling package I generated. I hope that’ll be enough information to help get me pointed in the right direction. I already tried searching it with the following regex, with no success: .*Debug\+Asserts.*
@Axel How can we incorporate this with int main (int argc, char ** argv). How do we call it at the end. For any functions with arguments how do we call it at the end.