Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add test for https://github.com/root-project/root/issues/13574 #1030

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
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
8 changes: 4 additions & 4 deletions root/io/issue-7754/read_cmssw_class_v3.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ void Print(const Holder &h)
}

#ifdef __ROOTCLING__
#pragma read sourceClass="SubContent" targetClass="SubContent" versions="[2]" source="int fValue" target="fValue" code="{ fValue = 100 * onfile.fValue; }"
pcanal marked this conversation as resolved.
Show resolved Hide resolved
#pragma read sourceClass="SubContent" targetClass="SubContent" versions="[2]" source="int fValue" target="fNewValue" code="{ fNewValue = 3000 * onfile.fValue; }"
#pragma read sourceClass="Content" targetClass="Content" versions="[2]" source="float fAfter" target="fAfter" code="{ fAfter = 10 * onfile.fAfter; }"
#pragma read sourceClass="Content" targetClass="Content" versions="[2]" source="float fAfter" target="fNewData" code="{ fNewData = 20 * onfile.fAfter; }"
#pragma read sourceClass="SubContent" targetClass="SubContent" version="[2]" source="int fValue" target="fValue" code="{ fValue = 100 * onfile.fValue; }"
#pragma read sourceClass="SubContent" targetClass="SubContent" version="[2]" source="int fValue" target="fNewValue" code="{ fNewValue = 3000 * onfile.fValue; }"
#pragma read sourceClass="Content" targetClass="Content" version="[2]" source="float fAfter" target="fAfter" code="{ fAfter = 10 * onfile.fAfter; }"
#pragma read sourceClass="Content" targetClass="Content" version="[2]" source="float fAfter" target="fNewData" code="{ fNewData = 20 * onfile.fAfter; }"

#endif

Expand Down
6 changes: 3 additions & 3 deletions root/io/issue-9899/read_cmssw_class_v3.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ struct Values {

#ifdef __ROOTCLING__
#pragma read sourceClass="RefVectorBase" targetClass="RefVectorBase" source="" \
versions="1-" target="fTransient" code="{ fTransient.clear(); }"
version="[1-]" target="fTransient" code="{ fTransient.clear(); }"
pcanal marked this conversation as resolved.
Show resolved Hide resolved
#pragma read sourceClass="RefVectorMemberPointersHolder" targetClass="RefVectorMemberPointersHolder" source="" \
versions="1-" target="fTransient" code="{ fTransient.clear(); }"
version="[1-]" target="fTransient" code="{ fTransient.clear(); }"
#pragma read sourceClass="LowData" targetClass="LowData" source="Values fValues" \
versions="1-" target="fNewValues" code="{ fNewValues = onfile.fValues; }"
version="[1-]" target="fNewValues" code="{ fNewValues = onfile.fValues; }"
#endif

struct LowData {
Expand Down
4 changes: 2 additions & 2 deletions root/io/issue-9899/write_cmssw_class_v2.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ struct Values {

#ifdef __ROOTCLING__
#pragma read sourceClass="RefVectorBase" targetClass="RefVectorBase" source="" \
versions="1-" target="fTransient" code="{ fTransient.clear(); }"
version="[1-]" target="fTransient" code="{ fTransient.clear(); }"
#pragma read sourceClass="RefVectorMemberPointersHolder" targetClass="RefVectorMemberPointersHolder" source="" \
versions="1-" target="fTransient" code="{ fTransient.clear(); }"
version="[1-]" target="fTransient" code="{ fTransient.clear(); }"
#endif

struct LowData {
Expand Down
2 changes: 1 addition & 1 deletion root/io/transient/execAtomTransient.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Holder {

#ifdef __ROOTCLING__
#pragma link C++ class Holder+;
#pragma read sourceClass="Holder" targetClass="Holder" versions="[1-]" source="" target="fCache" code="{ fCache = nullptr; }"
#pragma read sourceClass="Holder" targetClass="Holder" version="[1-]" source="" target="fCache" code="{ fCache = nullptr; }"
#endif


Expand Down
20 changes: 20 additions & 0 deletions root/io/uniquePointer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,26 @@ ROOTTEST_ADD_TEST(simpleRead
OUTREF simpleRead.ref
DEPENDS simpleWriteRead)

ROOTTEST_ADD_TEST(privacy-dict
COMMAND ${ROOT_rootcling_CMD} -f privacy.dict.cc
${CMAKE_CURRENT_SOURCE_DIR}/privacy.hh
${CMAKE_CURRENT_SOURCE_DIR}/privacyLinkDef.h
OUTREF privacyDict.oref
ERRREF privacyDict.eref)

ROOTTEST_GENERATE_DICTIONARY(privacy privacy.hh LINKDEF privacyLinkDef.h)
pcanal marked this conversation as resolved.
Show resolved Hide resolved

ROOTTEST_ADD_TEST(privacy-load
MACRO privacyLoad.C
OUTREF privacyLoad.oref
ERRREF privacyLoad.eref
DEPENDS ${GENERATE_DICTIONARY_TEST})

ROOTTEST_ADD_TEST(privacy-interp
MACRO privacyInterp.C
OUTREF privacyInterp.oref
ERRREF privacyInterp.eref)

ROOTTEST_GENERATE_REFLEX_DICTIONARY(classes classes.h SELECTION sel.xml)

ROOTTEST_ADD_TEST(simpleWriteRead
Expand Down
50 changes: 50 additions & 0 deletions root/io/uniquePointer/ns_privacy.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#ifndef ns_privacy_hh
pcanal marked this conversation as resolved.
Show resolved Hide resolved
#define ns_privacy_hh
#include <iostream>
#include <filesystem>
#include <tuple>

namespace fs = std::filesystem;

namespace privacy
{

class test
{
public:
test() = default;
~test() = default;

private:
fs::path path; ///<!
fs::path persistent_path;
};

class test1 {
private:
struct Inner { struct Most {}; };
std::unique_ptr<Inner> unique_data;
Inner *ptr_data;
};

class test2 {
private:
test1 transient_data; ///<!
test1 persistent_data;
};

class test3 {
private:
struct Inner {};
std::tuple<int, Inner> persistent_data;
std::tuple<int, int, Inner> transient_data; ///<!
};

class test4 {
private:
test3 transient_data; ///<!
};

} // namespace privacy

#endif // ns_privacy_hh
45 changes: 45 additions & 0 deletions root/io/uniquePointer/privacy.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#ifndef privacy_hh
#define privacy_hh
#include <iostream>
#include <filesystem>
#include <tuple>

namespace fs = std::filesystem;

class test
{
public:
test() = default;
~test() = default;

private:
fs::path path; ///<!
fs::path persistent_path;
};

class test1 {
private:
struct Inner { struct Most {}; };
std::unique_ptr<Inner> unique_data;
Inner *ptr_data;
};

class test2 {
private:
test1 transient_data; ///<!
test1 persistent_data;
};

class test3 {
private:
struct Inner {};
std::tuple<int, Inner> persistent_data;
std::tuple<int, int, Inner> transient_data; ///<!
};

class test4 {
private:
test3 transient_data; ///<!
};

#endif
Empty file.
Empty file.
32 changes: 32 additions & 0 deletions root/io/uniquePointer/privacyInterp.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#include "ns_privacy.hh"

int privacyInterp() {

const char *names[] = {
"privacy::test",
"privacy::test1",
"privacy::test2",
"privacy::test3",
"privacy::test4"
};

for(auto name : names) {
auto cl = TClass::GetClass(name);
if (!cl) {
std::cout << "Could not find class " << name << "\n";
return 1;
}
std::cout << "Data member list for " << name << '\n';
for(auto member : *cl->GetStreamerInfo()->GetElements()) {
if (auto el = dynamic_cast<TStreamerElement*>(member)) {
std::cout << " " << el->GetTypeName();
if (el->IsaPointer() && !TString(el->GetTypeName()).Contains("*"))
std::cout << "*";
std::cout << " " << el->GetName() << '\n';
}
}
std::cout << '\n';
}

return 0;
}
7 changes: 7 additions & 0 deletions root/io/uniquePointer/privacyInterp.eref
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Warning in <TStreamerInfo::Build>: privacy::test: filesystem::path has no streamer or dictionary, data member "persistent_path" will not be saved
Error in <TStreamerInfo::Build>: privacy::test1: privacy::test1::Inner has no streamer or dictionary, data member unique_data will not be saved
Error in <TStreamerInfo::Build>: privacy::test1: privacy::test1::Inner* has no streamer or dictionary, data member ptr_data will not be saved
Warning in <TStreamerInfo::Build>: privacy::test2: privacy::test1 has no streamer or dictionary, data member "persistent_data" will not be saved
Error in <Load>: Could not declare alternate type for tuple<int,privacy::test3::Inner> since privacy::test3::Inner (or one of its context) is private or protected
Warning in <TClass::Init>: no dictionary for class tuple<int,privacy::test3::Inner> is available
Warning in <TStreamerInfo::Build>: privacy::test3: tuple<int,privacy::test3::Inner> has no streamer or dictionary, data member "persistent_data" will not be saved
18 changes: 18 additions & 0 deletions root/io/uniquePointer/privacyInterp.oref
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

Processing /home/pcanal/root_working/code/root/roottest/root/io/uniquePointer/privacyInterp.C...
Data member list for privacy::test
filesystem::path persistent_path

Data member list for privacy::test1
privacy::test1::Inner* unique_data
privacy::test1::Inner* ptr_data

Data member list for privacy::test2
privacy::test1 persistent_data

Data member list for privacy::test3
tuple<int,privacy::test3::Inner> persistent_data

Data member list for privacy::test4

(int) 0
15 changes: 15 additions & 0 deletions root/io/uniquePointer/privacyLinkDef.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#pragma link C++ class test+;

// We can generate the dictionary for this class even-though it has
// data members whose types is private. There will be a clear error
// message if the user request the StreamerInfo for this class.
#pragma link C++ class test1+;

// Dictionary of private classes is not supported, uncommented this leads
// to the expected warning message explaining this.
// #pragma link C++ class test1::Inner+;

#pragma link C++ class test2+;
#pragma link C++ class test3+;
#pragma link C++ class test4+;

40 changes: 40 additions & 0 deletions root/io/uniquePointer/privacyLoad.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
int privacyLoad() {
gSystem->Load("privacy");

// On Windows <fstream> leads to a forward declaration of
// std::filesystem::path and since we do not generate a dictonary for that
// class, there is also no autoparsing. This leads to a state that is
// different from the state in other platform and incurred an additional
// spurrious:
// ```Warning in <TClass::Init>: no dictionary for class filesystem::path is available```
// (due to the forward declaration only state).
gInterpreter->Declare("#include <filesystem>");

const char *names[] = {
"test",
"test1",
"test2",
"test3",
"test4"
};

for(auto name : names) {
auto cl = TClass::GetClass(name);
if (!cl) {
std::cout << "Could not find class " << name << '\n';
return 1;
}
std::cout << "Data member list for " << name << '\n';
for(auto member : *cl->GetStreamerInfo()->GetElements()) {
if (auto el = dynamic_cast<TStreamerElement*>(member)) {
std::cout << " " << el->GetTypeName();
if (el->IsaPointer() && !TString(el->GetTypeName()).Contains("*"))
std::cout << "*";
std::cout << " " << el->GetName() << '\n';
}
}
std::cout << '\n';
}

return 0;
}
6 changes: 6 additions & 0 deletions root/io/uniquePointer/privacyLoad.eref
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Warning in <TStreamerInfo::Build>: test: filesystem::path has no streamer or dictionary, data member "persistent_path" will not be saved
Error in <TStreamerInfo::Build>: test1: test1::Inner has no streamer or dictionary, data member unique_data will not be saved
Error in <TStreamerInfo::Build>: test1: test1::Inner* has no streamer or dictionary, data member ptr_data will not be saved
Error in <Load>: Could not declare alternate type for tuple<int,test3::Inner> since test3::Inner (or one of its context) is private or protected
Warning in <TClass::Init>: no dictionary for class tuple<int,test3::Inner> is available
Warning in <TStreamerInfo::Build>: test3: tuple<int,test3::Inner> has no streamer or dictionary, data member "persistent_data" will not be saved
18 changes: 18 additions & 0 deletions root/io/uniquePointer/privacyLoad.oref
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

Processing /home/pcanal/root_working/code/root/roottest/root/io/uniquePointer/privacyLoad.C...
Data member list for test
filesystem::path persistent_path

Data member list for test1
test1::Inner* unique_data
test1::Inner* ptr_data

Data member list for test2
test1 persistent_data

Data member list for test3
tuple<int,test3::Inner> persistent_data

Data member list for test4

(int) 0