[cfe-dev] Tooling vs -fdelayed-template-parsing WAS: Clang-cl.exe and the VC++ preprocessor
Kim Gräsman
kim.grasman at gmail.com
Mon Aug 4 09:06:03 PDT 2014
Hi Manuel,
On Mon, Aug 4, 2014 at 2:43 PM, Manuel Klimek <klimek at google.com> wrote:
>
> Can we somehow get this into the tooling infrastructure? I'd consider it a
> bug if fdelayed-template-parsing leads to ASTs that don't have the
> templates; from reading the docs, it seems like all it should do is parse
> them at the end of the translation unit, or am I missing something?
>
This is what we did in IWYU, right after our original AST traversal:
+ void InstantiateLateParsedFunctions() {
+ const vector<FunctionDecl*>& late_parsed_decls =
LateParsedFunctionDecls();
+ clang::Sema& sema = compiler()->getSema();
+
+ // If we have any late-parsed functions, make sure the
+ // -fdelayed-template-parsing flag is on. Otherwise we don't know where
+ // they came from.
+ CHECK_((compiler()->getLangOpts().DelayedTemplateParsing ||
+ late_parsed_decls.empty()) &&
+ "Should not have late-parsed decls without "
+ "-fdelayed-template-parsing.");
+
+ for (Each<FunctionDecl*> it(&late_parsed_decls); !it.AtEnd(); ++it) {
+ FunctionDecl* decl = *it;
+ if (decl->isLateTemplateParsed()) {
+ // Force parsing and AST building of the yet-uninstantiated
function
+ // template body.
+ clang::LateParsedTemplate* lpt = sema.LateParsedTemplateMap[decl];
+ sema.LateTemplateParser(sema.OpaqueParser, *lpt);
+
+ // Traverse the AST fragment again to run IWYU analysis on the new
+ // nodes.
+ TraverseDecl(decl);
+ }
+ }
+ }
After parsing, you'd have to run a second pass of your matcher AST visitor.
I could get away with just visiting the instantiated Decl (or so I hope),
but that might not be enough for your needs.
I'm still not sure this is 100% right, of course.
- Kim
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140804/21a5fcc4/attachment.html>
More information about the cfe-dev
mailing list