llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Jonas Hahnfeld (hahnjo) <details> <summary>Changes</summary> When instantiating a delayed template, the recorded token stream is passed to `Parser::ParseLateTemplatedFuncDef` which will append the current token "so it doesn't get lost". With incremental extensions enabled, this is `repl_input_end` which subsequently needs support for (de)serialization. --- Full diff: https://github.com/llvm/llvm-project/pull/103028.diff 3 Files Affected: - (modified) clang/lib/Serialization/ASTReader.cpp (+1) - (modified) clang/lib/Serialization/ASTWriter.cpp (+1) - (added) clang/test/Interpreter/delayed-template-parsing-pch.cpp (+25) ``````````diff diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 511e2df7ad3230..fa9b815239dbb6 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1887,6 +1887,7 @@ Token ASTReader::ReadToken(ModuleFile &M, const RecordDataImpl &Record, case tok::annot_pragma_unused: case tok::annot_pragma_openacc: case tok::annot_pragma_openacc_end: + case tok::annot_repl_input_end: break; default: llvm_unreachable("missing deserialization code for annotation token"); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 1455f8e4145cb8..5cfb98c2a1060a 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -4734,6 +4734,7 @@ void ASTWriter::AddToken(const Token &Tok, RecordDataImpl &Record) { case tok::annot_pragma_unused: case tok::annot_pragma_openacc: case tok::annot_pragma_openacc_end: + case tok::annot_repl_input_end: break; default: llvm_unreachable("missing serialization code for annotation token"); diff --git a/clang/test/Interpreter/delayed-template-parsing-pch.cpp b/clang/test/Interpreter/delayed-template-parsing-pch.cpp new file mode 100644 index 00000000000000..f3bd4649ed0345 --- /dev/null +++ b/clang/test/Interpreter/delayed-template-parsing-pch.cpp @@ -0,0 +1,25 @@ +// Test the setup without incremental extensions first +// RUN: %clang_cc1 -std=c++17 -fdelayed-template-parsing -fpch-instantiate-templates %s -emit-pch -o %t.pch -verify +// RUN: %clang_cc1 -std=c++17 -fdelayed-template-parsing -include-pch %t.pch %s -verify + +// RUN: %clang_cc1 -std=c++17 -fdelayed-template-parsing -fincremental-extensions -fpch-instantiate-templates %s -emit-pch -o %t.incremental.pch -verify +// RUN: %clang_cc1 -std=c++17 -fdelayed-template-parsing -fincremental-extensions -include-pch %t.incremental.pch %s -verify + +// expected-no-diagnostics + +#ifndef PCH +#define PCH + +// Have one template that is instantiated in the PCH (via the passed option +// -fpch-instantiate-templates) and then serialized +template <typename T> T ft1() { return 0; } +inline int f1() { return ft1<int>(); } + +// Have a second late-parsed template that needs to be deserialized +template <typename T> T ft2() { return 0; } + +#else + +int f2() { return ft2<int>(); } + +#endif `````````` </details> https://github.com/llvm/llvm-project/pull/103028 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits