Avoid collision between tag and typedef identifier#166
Merged
Conversation
lucic71
added a commit
to lucic71/cpp2rust
that referenced
this pull request
Jun 4, 2026
C allows name collision between the following 2 declarations:
```c
struct X {};
typedef enum {} X;
```
The 2 declarations live in different name spaces:
6.2.3 Name spaces of identifiers
[...] there are separate namespaces for various categories of
identifiers, as follows:
1. the tags of structures, unions, and enumerations (disambiguated by
following any) of the keywords struct, union, or enum);
2. all other identifiers, called ordinary identifiers (declared in
ordinary declarators or as enumeration constants).
`struct X {}` lives in namespace 1 and `typedef enum {} X` lives in
namespace 2.
We cannot translate both to `X` in the Rust code. We need to
disambiguate between the 2 names. I chose to translate them as:
```
struct X {} -> X
typedef enum {} X -> X_enum
```
C++ does not have the name space rule for identifiers. I added the
`tag->getASTContext().getLangOpts().CPlusPlus` check in
DisambiguateAnonymousTag to avoid polluting the C++ generated files.
---------
Co-authored-by: Nuno Lopes <nuno.lopes@tecnico.ulisboa.pt>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
C allows name collision between the following 2 declarations:
The 2 declarations live in different name spaces:
6.2.3 Name spaces of identifiers
[...] there are separate namespaces for various categories of identifiers, as follows:
struct X {}lives in namespace 1 andtypedef enum {} Xlives in namespace 2.We cannot translate both to
Xin the Rust code. We need to disambiguate between the 2 names. I chose to translate them as:C++ does not have the name space rule for identifiers. I added the
tag->getASTContext().getLangOpts().CPlusPluscheck in DisambiguateAnonymousTag to avoid polluting the C++ generated files.