Open nxmaintainer opened 1 year ago
Thanks for the detailed report.
To help further narrow down the issue you can insert a printout (or a stack trace) where CParser
adds object
to the type map (from which point on it considers it a TYPEID
) - this can tell us why it thinks it's a pre-declared type.
I'm parsing cpython/Object/exceptions.c with
pycparser==2.21
(pypi), preprocessed (exceptions.i) withcpp -nostdinc -E -P -DPy_BUILD_CORE=1 -D_POSIX_THREADS=1
+ standard includes andfake_libc_include
. Nothing special or tricky.Fails in this block:
and particularly on
offsetof(PyUnicodeErrorObject, object)
withpycparser.plyparser.ParseError: :9792:46: before: object
Works perfectly fine if I replace
object
field name with anything else, or replace theoffsetof
function. There's a difference in parsing the firstoffsetof
in this block (encoding
field) and the next one (object
field) according to the debug mode.For `encoding`, take a look at `LexToken(ID,'encoding',9790,365338)` closer to the end:
``` Stack : translation_unit declaration_specifiers declarator EQUALS brace_open designation_opt brace_open initializer_list COMMA . LexToken(OFFSETOF,'offsetof',9790,365307) Action : Reduce rule [empty ->For `object`, take a look at `LexToken(TYPEID,'object',9792,365420)` in the same position where `encoding` has `ID` instead:
``` Stack : translation_unit declaration_specifiers declarator EQUALS brace_open initializer_list COMMA designation_opt brace_open initializer_list COMMA . LexToken(OFFSETOF,'offsetof',9792,365389) Action : Reduce rule [empty ->I approximately understand the issue,
object
is being interpreted asTYPEID
for some reason (I've checked, and didn't findobject
type being defined/declared in the preprocessed file), so it doesn't fitoffsetof_member_designator
rule (which requiresidentifier
, which isID
) and fails the primaryOFFSETOF
expression. I even have a dirty fix, like this:But I don't think this is a correct approach, and looks like the issue is deeper (
object
initially shouldn't beTYPEID
in this context, no?). @eliben / @Ksero I'd really appreciate if you can point me to a better solution, I'd be happy to contribute.P.S. Please, use
exceptions.i
for tests, I've tried to make smaller reproducible sample, it just works fine.