@@ -274,3 +274,62 @@ TEST_F(TClingTests, ROOT10499) {
274274 EXPECT_EQ ((void *)&errno, (void *)gInterpreter ->Calc (" &errno" ));
275275#endif
276276}
277+
278+ // ROOT-6913
279+ TEST_F (TClingTests, ClassInfoProperty)
280+ {
281+ gInterpreter ->Declare (R"cpp(
282+ class ClassHasExplicitCtor{
283+ public:
284+ ClassHasExplicitCtor(){};
285+ };
286+
287+ class ClassHasExplicitDtor{
288+ public:
289+ ~ClassHasExplicitDtor(){};
290+ };
291+
292+ class ClassHasImplicitCtor {
293+ ClassHasExplicitCtor c;
294+ };
295+
296+ class ClassHasImplicitDtor{
297+ ClassHasExplicitDtor c;
298+ };
299+
300+ class ClassHasDefaultCtor{
301+ ClassHasDefaultCtor(){};
302+ };
303+
304+ class ClassIsAbstract{
305+ virtual void PureVirtual() = 0;
306+ };
307+
308+ class ClassHasVirtual{
309+ virtual void Virtual() {};
310+ };
311+
312+ class ClassHasAssignOpr{
313+ ClassHasAssignOpr& operator=(const ClassHasAssignOpr&);
314+ };
315+
316+ // according to the C++ standard, being a POD implies being an aggregate
317+ struct ClassIsAggregate {
318+ int x;
319+ double y;
320+ };
321+ )cpp" );
322+
323+ const std::vector<std::pair<std::string, Long_t>> classNPPairs{
324+ {" ClassHasImplicitCtor" , kClassHasImplicitCtor }, {" ClassHasExplicitCtor" , kClassHasExplicitCtor },
325+ {" ClassHasExplicitDtor" , kClassHasExplicitDtor }, {" ClassHasImplicitDtor" , kClassHasImplicitDtor },
326+ {" ClassHasDefaultCtor" , kClassHasDefaultCtor }, {" ClassHasDefaultCtor" , kClassIsValid },
327+ {" ClassIsAbstract" , kClassIsAbstract }, {" ClassHasVirtual" , kClassHasVirtual },
328+ {" ClassHasAssignOpr" , kClassHasAssignOpr }, {" ClassIsAggregate" , kClassIsAggregate }};
329+
330+ for (auto &[clName, clPropRef] : classNPPairs) {
331+ auto cl = TClass::GetClass (clName.c_str ());
332+ const auto prop = gInterpreter ->ClassInfo_ClassProperty (cl->GetClassInfo ());
333+ EXPECT_TRUE (prop & clPropRef) << " Error checking property for class " << clName;
334+ }
335+ }
0 commit comments