Fixes #14921: Detect enums before simplifying platform types - #8736
Fixes #14921: Detect enums before simplifying platform types#8736autoantwort wants to merge 1 commit into
Conversation
|
This issue has come up multiple times before, and is not restricted to enums or the Windows library, see e.g. https://trac.cppcheck.net/ticket/12589 Contributing factors:
I don't think the proposed change is the right way to address this. Maybe |
There was a problem hiding this comment.
is it OK to redefine HANDLE in the global scope? If I compile this code:
typedef void* HANDLE;
enum {HANDLE, X};
I get such gcc errors:
1.c:3:7: error: ‘HANDLE’ redeclared as different kind of symbol
I assume windows.h defines HANDLE using a typedef?
There was a problem hiding this comment.
I feel there is some missing scope in the example code. HANDLE in the global scope should be simplified as a void * if --library=windows has been used .. and HANDLE in your inner scope should be handled as the enum constant. We need to distinguish which type to use in different scopes..
If i compile this typedef void* HANDLE;
enum class E {HANDLE, X};it compiles without errors. |
I guess the right fix would be introducing typedefs for the types instead of replacing them in the AST without context information. |
| } | ||
|
|
||
| void platformWinEnumerator() { | ||
| // #11538 - HANDLE is a platform type (-> void*) but here it's an enumerator and must not be replaced |
There was a problem hiding this comment.
trac ticket 11538 is about a syntax error
I think I am thinking the same. However not by introducing some To simplify platform types.. can we reuse the logic that simplifies typedefs in This code: This And ValueFlow determines the value for my suggestion; we would break out code from Tokenizer::simplifyTypedefCpp into a function that we then call from simplifyPlatformType also. |
No description provided.