Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion notebooks/hello_world.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
"file_extension": ".cpp",
"mimetype": "text/x-c++src",
"name": "C++",
"version": "23"
"version": "cxx23"
}
},
"nbformat": 4,
Expand Down
2 changes: 1 addition & 1 deletion notebooks/tinyraytracer.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"file_extension": ".cpp",
"mimetype": "text/x-c++src",
"name": "C++",
"version": "23"
"version": "cxx23"
}
},
"nbformat_minor": 5,
Expand Down
2 changes: 1 addition & 1 deletion notebooks/xeus-cpp-lite-demo.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"file_extension": ".cpp",
"mimetype": "text/x-c++src",
"name": "C++",
"version": "23"
"version": "cxx23"
}
},
"nbformat_minor": 5,
Expand Down
2 changes: 1 addition & 1 deletion notebooks/xeus-cpp.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -886,7 +886,7 @@
"file_extension": ".cpp",
"mimetype": "text/x-c++src",
"name": "C++",
"version": "20"
"version": "cxx20"
}
},
"nbformat": 4,
Expand Down
117 changes: 93 additions & 24 deletions src/xinterpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,33 +101,102 @@ namespace xcpp
xeus::register_interpreter(this);
}

// FIXME: This function should be upstreamed to CppInterOp. See
// https://github.com/compiler-research/CppInterOp/issues/879
static std::string get_stdopt()
{
// We need to find what's the C++ version the interpreter runs with.
const char* code = R"(
int __get_cxx_version () {
#if __cplusplus > 202302L
return 26;
#elif __cplusplus > 202002L
return 23;
#elif __cplusplus > 201703L
return 20;
#elif __cplusplus > 201402L
return 17;
#elif __cplusplus > 201103L || (defined(_WIN32) && _MSC_VER >= 1900)
return 14;
#elif __cplusplus >= 201103L
return 11;
#else
return 0;
#endif
}
__get_cxx_version ()
)";
auto cxx_version = Cpp::Evaluate(code);
return std::to_string(cxx_version);
}
switch (Cpp::GetLanguageStandard(nullptr))
{
case Cpp::InterpreterLanguageStandard::c89:
return "c89";
case Cpp::InterpreterLanguageStandard::c94:
return "c94";
case Cpp::InterpreterLanguageStandard::gnu89:
return "gnu89";
case Cpp::InterpreterLanguageStandard::c99:
return "c99";
case Cpp::InterpreterLanguageStandard::gnu99:
return "gnu99";
case Cpp::InterpreterLanguageStandard::c11:
return "c11";
case Cpp::InterpreterLanguageStandard::gnu11:
return "gnu11";
case Cpp::InterpreterLanguageStandard::c17:
return "c17";
case Cpp::InterpreterLanguageStandard::gnu17:
return "gnu17";
case Cpp::InterpreterLanguageStandard::c23:
return "c23";
case Cpp::InterpreterLanguageStandard::gnu23:
return "gnu23";
case Cpp::InterpreterLanguageStandard::c2y:
return "c2y";
case Cpp::InterpreterLanguageStandard::gnu2y:
return "gnu2y";
case Cpp::InterpreterLanguageStandard::cxx98:
return "cxx98";
case Cpp::InterpreterLanguageStandard::gnucxx98:
return "gnucxx98";
case Cpp::InterpreterLanguageStandard::cxx11:
return "cxx11";
case Cpp::InterpreterLanguageStandard::gnucxx11:
return "gnucxx11";
case Cpp::InterpreterLanguageStandard::cxx14:
return "cxx14";
case Cpp::InterpreterLanguageStandard::gnucxx14:
return "gnucxx14";
case Cpp::InterpreterLanguageStandard::cxx17:
return "cxx17";
case Cpp::InterpreterLanguageStandard::gnucxx17:
return "gnucxx17";
case Cpp::InterpreterLanguageStandard::cxx20:
return "cxx20";
case Cpp::InterpreterLanguageStandard::gnucxx20:
return "gnucxx20";
case Cpp::InterpreterLanguageStandard::cxx23:
return "cxx23";
case Cpp::InterpreterLanguageStandard::gnucxx23:
return "gnucxx23";
case Cpp::InterpreterLanguageStandard::cxx26:
return "cxx26";
case Cpp::InterpreterLanguageStandard::gnucxx26:
return "gnucxx26";
case Cpp::InterpreterLanguageStandard::opencl10:
return "opencl10";
case Cpp::InterpreterLanguageStandard::opencl11:
return "opencl11";
case Cpp::InterpreterLanguageStandard::opencl12:
return "opencl12";
case Cpp::InterpreterLanguageStandard::opencl20:
return "opencl20";
case Cpp::InterpreterLanguageStandard::opencl30:
return "opencl30";
case Cpp::InterpreterLanguageStandard::openclcpp10:
return "openclcpp10";
case Cpp::InterpreterLanguageStandard::openclcpp2021:
return "openclcpp2021";
case Cpp::InterpreterLanguageStandard::hlsl:
return "hlsl";
case Cpp::InterpreterLanguageStandard::hlsl2015:
return "hlsl2015";
case Cpp::InterpreterLanguageStandard::hlsl2016:
return "hlsl2016";
case Cpp::InterpreterLanguageStandard::hlsl2017:
return "hlsl2017";
case Cpp::InterpreterLanguageStandard::hlsl2018:
return "hlsl2018";
case Cpp::InterpreterLanguageStandard::hlsl2021:
return "hlsl2021";
case Cpp::InterpreterLanguageStandard::hlsl202x:
return "hlsl202x";
case Cpp::InterpreterLanguageStandard::hlsl202y:
return "hlsl202y";
case Cpp::InterpreterLanguageStandard::lang_unspecified:
return "lang_unspecified";
}
Comment on lines +108 to +196
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That will need to move to cppinterop in a longer run...

Copy link
Copy Markdown
Collaborator Author

@mcbarton mcbarton Mar 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes for the next cppinterop release I will upstream this function. This PR is ready as of now, if your willing to approve and take it in.

I'm not sure what this will return for the openmp kernels. I suspect it will return the c/c++ standard.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it should be fine assuming we have a fixme explaining that and pointing to a bug report in cppinterop

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added fixme comment. Also did this for my PR about using CppInterOp to get the language (this PR #462)

Copy link
Copy Markdown
Collaborator

@anutosh491 anutosh491 Mar 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Arghh okay I'm not a fan of a huge switch case like this lying in xinterpreter.cpp !

Should be restricted to creating the interpreter and overriding the kernel methods from xeus.

Can this lie in a xutils/xhelper ? (we should have one I think)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also let's just start with the kernels we currently cater to ? I guess we don't need such a huge switch case.

Offcourse when shifting it to cppinterop we should have everything !

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've reduced it so that get_stdopt covers all the c++ standards we did previously, plus all the c standards from c11 onwards, since we have the c kernels now.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Turns out I need to cover all cases otherwise I get these errors https://github.com/compiler-research/xeus-cpp/actions/runs/23733299499/job/69131805701?pr=461#step:11:33 , since we treat all warnings as errors in the ci. I will switch back.


return "unknown";
}
interpreter::interpreter(int argc, const char* const* argv) :
xmagics()
, p_cout_strbuf(nullptr)
Expand Down
2 changes: 1 addition & 1 deletion test/test_interpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ TEST_SUITE("kernel_info_request")
REQUIRE(result["language_info"]["mimetype"] == "text/x-c++src");
REQUIRE(result["language_info"]["codemirror_mode"] == "text/x-c++src");
REQUIRE(result["language_info"]["file_extension"] == ".cpp");
REQUIRE(result["language_info"]["version"] == "23");
REQUIRE(result["language_info"]["version"] == "cxx23");
REQUIRE(result["status"] == "ok");
}

Expand Down
Loading