Subject: bin/36444: flex generates bad C++ code
To: None <gnats-admin@netbsd.org, netbsd-bugs@netbsd.org>
From: None <mlelstv@serpens.de>
List: netbsd-bugs
Date: 06/05/2007 14:30:01
>Number: 36444
>Category: bin
>Synopsis: flex generates bad C++ code
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: bin-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Tue Jun 05 14:30:01 +0000 2007
>Originator: Michael van Elst
>Release: NetBSD 4.0_BETA2
>Organization:
--
Michael van Elst
Internet: mlelstv@serpens.de
"A potential Snark may lurk in every tree."
>Environment:
System: NetBSD henery 4.0_BETA2 NetBSD 4.0_BETA2 (HENERY) #1: Sun Jun 3 12:09:36 CEST 2007 mlelstv@henery:/home/netbsd4/obj/home/netbsd4/src/sys/arch/i386/compile/HENERY i386
Architecture: i386
Machine: i386
>Description:
When compiling a flex source from the net/irrtoolkit-nox11 package,
I get an error message from the C++ compiler about the ambigous
call to an overloaded function.
>How-To-Repeat:
Here is a test case that shows the problem:
-------- snip --------
%option case-insensitive
%{
#include <cstdio>
#include <cstring>
%}
%%
[A-Z][A-Z0-9]* {
printf("word = %s\n",yytext);
}
%%
class Object {
public:
char *contents;
unsigned long size;
Object(const char buf[]) {
contents = strdup(buf);
size = strlen(buf);
}
};
int length(const char *s)
{
return strlen(s);
}
int main() {
Object *o = new Object("1 Word");
void *p;
p = yy_scan_bytes(o->contents, o->size);
BEGIN(INITIAL);
}
extern "C" {
int yywrap() {
return 1;
}
}
-------- snip --------
% flex c.l
% % c++ lex.yy.c
c.l: In function 'int main()':
c.l:34: error: call of overloaded 'yy_scan_bytes(char*&, long unsigned int&)' is ambiguous
lex.yy.c:1321: note: candidates are: yy_buffer_state* yy_scan_bytes(const char*, yy_size_t)
lex.yy.c:1355: note: yy_buffer_state* yy_scan_bytes(const char*, int)
The reason for this is a change in src/usr.bin/lex/flex.skl:1.21
| Traditional flex uses int instead of yy_size_t for some api functions.
| Unfortunately this mangles differently in c++, so we get undefined symbols.
| So we define the old function prototype to keep things happy.
This creates function duplicates for C (using yy_size_t) and C++ (using int)
that cause the ambiguity.
>Fix:
Reverting the change in flex.skl:1.21 solves the problem.
>Unformatted: