<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Apr 24, 2020, at 2:44 PM, Richard Smith via cfe-users <<a href="mailto:cfe-users@lists.llvm.org" class="">cfe-users@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><div dir="ltr" class="">On Tue, 21 Apr 2020 at 05:41, Dr S3curity via cfe-users <<a href="mailto:cfe-users@lists.llvm.org" class="">cfe-users@lists.llvm.org</a>> wrote:<br class=""></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><div dir="ltr" class="">Hi,<div class=""><br class=""></div><div class="">Imagine the very basic code below, it has some missing elements, we dont have the foo() function and MyClass class,</div><div class=""><br class=""></div><div class="">```test.cpp</div><div class="">int main(int argc, char *argv[])<br class="">{<br class="">   <span class="Apple-converted-space"> </span>MyClass* mc = new MyClass();<br class="">   <span class="Apple-converted-space"> </span>mc.get_count();<br class="">   <span class="Apple-converted-space"> </span>foo(1, 2, 3);<br class="">   <span class="Apple-converted-space"> </span>std::cout << "this is a test" << endl;<br class="">}<br class=""></div><div class="">```</div><div class=""><br class=""></div><div class="">How can I get AST for that code?</div><div class="">I tried `clang -Xclang -ast-dump -fsyntax-only test.cpp`, I can get the AST tree but without MyClass and foo() function, it doesn't even say foo is a function with 3 integer parameters.</div></div></blockquote></div></div></div></blockquote><div><br class=""></div><div>I am not really familiar with -frecovery-ast but since even such relatively simple C++ snippet is ambivalent I am not sure clang can actually answer your questions completely :(</div><div>It would have to "know" things like the following before it could tell you what "foo" or "MyClass" are.</div><div><br class=""></div><div>- Can't foo be a global object of class with call operator accepting 3 int-s?</div><div>- Do the parameters actually need to be int-s or just any types that have implicit conversions from int?</div><div>- Can't MyClass be a typedef?</div><div>- Can't macros be involved?</div><div>- Can't the code actually be semantically incorrect?</div><div><br class=""></div><blockquote type="cite" class=""><div dir="ltr" style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><div dir="ltr" class=""><div class="">This can be problematic for different cases for example IDE's where you dont have all the project dependencies but yet you need to know what are the elements in your code.</div><div class=""><br class=""></div><div class="">Is that possible to do with libclang? Any other suggestions are welcome.</div></div></blockquote><div class=""><br class=""></div><div class="">You can request that more invalid portions of the AST are retained by using `-Xclang -frecovery-ast`. In this case, that will preserve the function call expression as a RecoveryExpr. For now at least, we don't have the ability to preserve AST information for the invalid "new MyClass" nor the expression using of undeclared "std::cout" and "endl", but -frecovery-ast is expected to improve over time to retain more such AST nodes. (And perhaps eventually it will be enabled by default, at which point the flag for it might disappear. We don't guarantee any forward compatibility with -Xclang flags.)</div></div></div></blockquote><div><br class=""></div><div>IIUC you'd still have to decide what you think the RecoveryExpr AST node actually is - it could be a CXXMemberCallExpr if it's a call operator or just a CallExpr if foo is a free function.</div><br class=""><blockquote type="cite" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">_______________________________________________</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">cfe-users mailing list</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><a href="mailto:cfe-users@lists.llvm.org" style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">cfe-users@lists.llvm.org</a><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users" style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users</a></blockquote></div><br class=""></body></html>