Purva-Chaudhari updated this revision to Diff 449059. Purva-Chaudhari added a comment.
Rebase CHANGES SINCE LAST ACTION https://reviews.llvm.org/D125944/new/ https://reviews.llvm.org/D125944 Files: clang/include/clang/Sema/Sema.h clang/lib/Interpreter/IncrementalParser.cpp clang/test/Interpreter/template-recovery.cpp Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -9592,6 +9592,19 @@ SavedPendingLocalImplicitInstantiations; }; + class PerformPendingInstantiationsRAII { + public: + PerformPendingInstantiationsRAII(Sema &S): S(S) {} ; + + ~PerformPendingInstantiationsRAII() { + S.PerformPendingInstantiations(); + assert(S.PendingInstantiations.empty() && + "there shouldn't be any pending instantiations"); + } + private: + Sema &S; + }; + /// A helper class for building up ExtParameterInfos. class ExtParameterInfoBuilder { SmallVector<FunctionProtoType::ExtParameterInfo, 16> Infos; Index: clang/lib/Interpreter/IncrementalParser.cpp =================================================================== --- clang/lib/Interpreter/IncrementalParser.cpp +++ clang/lib/Interpreter/IncrementalParser.cpp @@ -146,6 +146,7 @@ llvm::CrashRecoveryContextCleanupRegistrar<Sema> CleanupSema(&S); Sema::GlobalEagerInstantiationScope GlobalInstantiations(S, /*Enabled=*/true); Sema::LocalEagerInstantiationScope LocalInstantiations(S); + Sema::PerformPendingInstantiationsRAII PerformPendingInstantiations(S); PTUs.emplace_back(PartialTranslationUnit()); PartialTranslationUnit &LastPTU = PTUs.back(); Index: clang/test/Interpreter/template-recovery.cpp =================================================================== --- /dev/null +++ clang/test/Interpreter/template-recovery.cpp @@ -0,0 +1,16 @@ +// RUN: clang-repl "int i = 10;" 'extern "C" int printf(const char*,...);' \ +// RUN: 'auto r1 = printf("i = %d\n", i);' | FileCheck --check-prefix=CHECK-DRIVER %s +// REQUIRES: host-supports-jit +// UNSUPPORTED: system-aix +// CHECK-DRIVER: i = 10 +// RUN: cat %s | clang-repl | FileCheck %s + +template<class T> T f() { return T(); } +auto ptu2 = f<float>(); err; +auto ptu2 = f<float>(); + +extern "C" int printf(const char *, ...); +int i = 10; +auto r1 = printf("i = %d\n", i); +// CHECK: i = 10 +quit
Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -9592,6 +9592,19 @@ SavedPendingLocalImplicitInstantiations; }; + class PerformPendingInstantiationsRAII { + public: + PerformPendingInstantiationsRAII(Sema &S): S(S) {} ; + + ~PerformPendingInstantiationsRAII() { + S.PerformPendingInstantiations(); + assert(S.PendingInstantiations.empty() && + "there shouldn't be any pending instantiations"); + } + private: + Sema &S; + }; + /// A helper class for building up ExtParameterInfos. class ExtParameterInfoBuilder { SmallVector<FunctionProtoType::ExtParameterInfo, 16> Infos; Index: clang/lib/Interpreter/IncrementalParser.cpp =================================================================== --- clang/lib/Interpreter/IncrementalParser.cpp +++ clang/lib/Interpreter/IncrementalParser.cpp @@ -146,6 +146,7 @@ llvm::CrashRecoveryContextCleanupRegistrar<Sema> CleanupSema(&S); Sema::GlobalEagerInstantiationScope GlobalInstantiations(S, /*Enabled=*/true); Sema::LocalEagerInstantiationScope LocalInstantiations(S); + Sema::PerformPendingInstantiationsRAII PerformPendingInstantiations(S); PTUs.emplace_back(PartialTranslationUnit()); PartialTranslationUnit &LastPTU = PTUs.back(); Index: clang/test/Interpreter/template-recovery.cpp =================================================================== --- /dev/null +++ clang/test/Interpreter/template-recovery.cpp @@ -0,0 +1,16 @@ +// RUN: clang-repl "int i = 10;" 'extern "C" int printf(const char*,...);' \ +// RUN: 'auto r1 = printf("i = %d\n", i);' | FileCheck --check-prefix=CHECK-DRIVER %s +// REQUIRES: host-supports-jit +// UNSUPPORTED: system-aix +// CHECK-DRIVER: i = 10 +// RUN: cat %s | clang-repl | FileCheck %s + +template<class T> T f() { return T(); } +auto ptu2 = f<float>(); err; +auto ptu2 = f<float>(); + +extern "C" int printf(const char *, ...); +int i = 10; +auto r1 = printf("i = %d\n", i); +// CHECK: i = 10 +quit
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits