Skip to content

[core] Handle non-space whitespace in TClassEdit::CleanType#22766

Open
guitargeek wants to merge 1 commit into
root-project:masterfrom
guitargeek:issue-22359
Open

[core] Handle non-space whitespace in TClassEdit::CleanType#22766
guitargeek wants to merge 1 commit into
root-project:masterfrom
guitargeek:issue-22359

Conversation

@guitargeek

Copy link
Copy Markdown
Contributor

A class name in a selection XML can span multiple lines. CleanType() only treated ' ' as a blank, so a newline was kept in the cleaned name and, when the template arguments were later re-processed individually, an argument starting with a newline was truncated to an empty string. This corrupted the rootmap entries and the alternate name registrations (e.g. "Foo<,vector<float>,>"), leading to "Second registration of ..." errors from TClassTable::AddAlternate at library load time.

Treat all whitespace like a space: drop it where a space would be dropped, and emit a single plain space where it separates two identifiers.

Closes #22359.

🤖 Done with the help of AI.

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

Test Results

    23 files      23 suites   3d 16h 29m 59s ⏱️
 3 872 tests  3 865 ✅   0 💤 7 ❌
78 787 runs  78 670 ✅ 110 💤 7 ❌

For more details on these failures, see this check.

Results for commit 86afdaf.

♻️ This comment has been updated with latest results.

if (c[0]==' ') {
if (std::isspace(c[0])) {
if (kbl) continue;
if (!isalnum(c[ 1]) && c[ 1] !='_') continue;

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.

Suggested change
if (!isalnum(c[ 1]) && c[ 1] !='_') continue;
if (c + 1 == nullptr || (!isalnum(c[ 1]) && c[ 1] !='_')) continue;

should this be maybe guarded?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I'm assuming here that c is not nullptr, because typesDesc is expected to be a non-nullptr input. Then, also the c + 1 expression can also never be nullptr. About accessing the elements: reading c[1] is safe because the loop condition *c guarantees c[0] != '\0', so c[1] is at most the null terminator.

A class name in a selection XML can span multiple lines. `CleanType()`
only treated `' '` as a blank, so a newline was kept in the cleaned name
and, when the template arguments were later re-processed individually,
an argument starting with a newline was truncated to an empty string.
This corrupted the rootmap entries and the alternate name registrations
(e.g. `"Foo<,vector<float>,>"`), leading to `"Second registration of
..."` errors from `TClassTable::AddAlternate` at library load time.

Treat all whitespace like a space: drop it where a space would be
dropped, and emit a single plain space where it separates two
identifiers.

Closes root-project#22359.

🤖 Done with the help of AI.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

"Second registration of" error with a template argument "missing"

2 participants