[cfe-dev] Variable Length Array parameters in C++
Matthijs van Duin
matthijsvanduin at gmail.com
Thu Jul 9 11:51:35 PDT 2015
I've been looking into the state of VLAs and variably-modified types in
general in C++, and noticed that they actually seem quite well supported,
at least for local variables. Functions with VLA parameters however are
still a problem: you can define them, but you can't actually *call* them,
rendering them rather useless, e.g.:
extern void foo( int m, float x[][m] );
void bar( float x[][3] ) { foo( 3, x ); }
compiles in C mode but fails in C++ due to "no known conversion from 'float
(*)[3]' to 'float (*)[m]' for 2nd argument".
I've made a feeble attempt at tracking down the root cause... I've noticed
that in both cases the parameter in foo's declaration gets correctly
canonicalized to float (*)[*]. However, where C happily inserts an
ImplicitCastExpr 'float (*)[*]' <BitCast> into the AST for the second
argument to the call to foo(), C++ is unable to do the same. At this point
I got hopelessly lost: I've not been able to locate where this
ImplicitCastExpr is being generated, or why it is isn't generated in C++
mode.
Intuitively I'd expect it should be relatively easy and safe to add the
relevant implicit conversions to [*]-types, but I'm too unfamiliar with the
clang codebase to have any idea on how to do such a thing.
Can anyone help here? It would be really awesome not being forced to choose
between C++-without-VLA-parameters and C-with-VLA-parameters.
Matthijs
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150709/b272d220/attachment.html>
More information about the cfe-dev
mailing list