<div dir="ltr"><div><div><div>In general I would also say that doing code transformation should only be done on valid code since one needs to know what actually happens. This particular problem is unfortunately rather specific. Sorry if the given example was not sufficient.<br><br></div>Maybe the problem becomes clearer when class X is defined as wrapper for int with special functionality. <br><br>The code that I try to transform is part of a hardware simulation written/generated in c++. The code is guaranteed to be valid except for the partial substitution of int variables by X variables. The resulting invalid code statements are only invalid in the sense that a parameter type is not right. Due to the complexity of the code it is not feasible/possible to predict where type X and where int is used for such operations. Since some operators (e.g. [] for pointers) cannot be overloaded with standard c++ code, errors will come up. For that and other reasons it is necessary to rewrite the code to use custom functions instead of the operator itself. This is where my problem with clang lies. Those nodes are removed from the ast due to missing operator[]/missing type conversion. But those are the nodes i need to preserve in order to run a matcher and transform the code as needed for the simulation. Again as noted before adding operator int() to class X is not a solution since that would create many ambiguity problems.<br><br><br></div>So to boil the problem further down: How can i forces clang to ignore wrong types that are passed to operators/functions and build the ast with such nodes?<br><br></div><div>Again, I suspect that adding built-in operators for those cases is the way to go, but I don't know how to iterate over all types and then create empty dummy functions for that.<br></div><div><br></div>I hope this describes my problem sufficiently.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 9, 2014 at 12:53 PM, Manuel Klimek <span dir="ltr"><<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The general advise is to only do code transformations on valid code. I don't know enough about your problem to understand why that is not possible.<br><br><div class="gmail_quote"><div><div class="h5">On Tue Oct 07 2014 at 4:37:52 PM Marc Greim <<a href="mailto:marc.greim@mytum.de" target="_blank">marc.greim@mytum.de</a>> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div dir="ltr"><div><div><div><div><div>Hello,<br><br></div>I'm using clang to rewrite (generated) source code. Usually that can be done by running matchers on the ast in combination with a rewriter instance. <br><br>Unfortunately this fails in the case of operator[] where the index argument cannot be converted to a valid type (e.g. class X{} x; int * array; int i = array[x]; ). The corresponding ast nodes are missing since the "array[x]" statement has no valid representation.<br><br></div><div>How can I detect and rewrite the code in cases like above example? "array[x]" -> "someFunc(array,x)"<br><br></div><div>ExternalSemaSource::CorrectTypo dosen't get called in this case (maybe because all tokens are valid?) so that attempt failed.<br><br></div><div>Using ExternalSemaSource::LookupUnqualified also failed so far, because i haven't found a method to get a valid SourceRange for that code part. It would also require manual parsing of that code part which seem like a "dirty" solution to me.<br></div><div><br></div><div>The only idea that I have left is to declare builtin operators for any type with Sema::AddBuiltinCandidate, but that may result in many operator definitions. Also I have no idea how to iterate over all types and how to declare these functions. However this may be the best solution, because then matchers can be used to find and rewrite those code parts.<br><br></div><div>I would appreciate any help to find a solution.<br><br></div><div>Regards,<br></div><div>Marc<br><br></div><div><br></div><div>P.S. I am aware that adding operator int() to class X of above example would allow those statements but that is not an option, since X cannot be represented as int in my case and additional operations need to be performed; such an operator may also mess up other parts of the code.<br></div></div></div></div></div></div></div>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
</blockquote></div>
</blockquote></div><br></div>