https://github.com/ChuanqiXu9 created https://github.com/llvm/llvm-project/pull/79261
This comes from when I playing around clang-repl with moduels : ) I succeeded to import std with https://libcxx.llvm.org/Modules.html and calling `std::printf` after this patch. I want to put the documentation part to https://clang.llvm.org/docs/StandardCPlusPlusModules.html in a separate commit. >From 70cb9ac882605c3557dc41ea13a4b8945c59e9c2 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu <yedeng...@linux.alibaba.com> Date: Wed, 24 Jan 2024 14:21:25 +0800 Subject: [PATCH] Support C++20 Modules in clang-repl --- clang/docs/ReleaseNotes.rst | 2 ++ clang/include/clang/Basic/LangOptions.def | 2 +- clang/lib/Serialization/ASTReaderDecl.cpp | 6 ++--- clang/test/Interpreter/cxx20-modules.cppm | 31 +++++++++++++++++++++++ 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 clang/test/Interpreter/cxx20-modules.cppm diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index fc7511e9136734..db3d74e124e7d1 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -191,6 +191,8 @@ Crash and bug fixes Improvements ^^^^^^^^^^^^ +- Support importing C++20 modules in clang-repl. + Moved checkers ^^^^^^^^^^^^^^ diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 8fc75e1cca0399..1e671a7c460163 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -485,7 +485,7 @@ VALUE_LANGOPT(FuchsiaAPILevel, 32, 0, "Fuchsia API level") // on large _BitInts. BENIGN_VALUE_LANGOPT(MaxBitIntWidth, 32, 128, "Maximum width of a _BitInt") -LANGOPT(IncrementalExtensions, 1, 0, " True if we want to process statements" +COMPATIBLE_LANGOPT(IncrementalExtensions, 1, 0, " True if we want to process statements" "on the global scope, ignore EOF token and continue later on (thus " "avoid tearing the Lexer and etc. down). Controlled by " "-fincremental-extensions.") diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index a149d82153037f..867f4c47eaeceb 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -3286,10 +3286,10 @@ DeclContext *ASTDeclReader::getPrimaryContextForMerging(ASTReader &Reader, if (auto *OID = dyn_cast<ObjCInterfaceDecl>(DC)) return OID->getDefinition(); - // We can see the TU here only if we have no Sema object. In that case, - // there's no TU scope to look in, so using the DC alone is sufficient. + // We can see the TU here only if we have no Sema object. It is possible + // we're in clang-repl so we still need to get the primary context. if (auto *TU = dyn_cast<TranslationUnitDecl>(DC)) - return TU; + return TU->getPrimaryContext(); return nullptr; } diff --git a/clang/test/Interpreter/cxx20-modules.cppm b/clang/test/Interpreter/cxx20-modules.cppm new file mode 100644 index 00000000000000..bc2b722f6b5197 --- /dev/null +++ b/clang/test/Interpreter/cxx20-modules.cppm @@ -0,0 +1,31 @@ +// UNSUPPORTED: system-aix +// +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang -std=c++20 %t/mod.cppm --precompile \ +// RUN: -o %t/mod.pcm +// RUN: %clang %t/mod.pcm -c -o %t/mod.o +// RUN: %clang -shared %t/mod.o -o %t/libmod.so +// +// RUN: cat %t/import.cpp | env LD_LIBRARY_PATH=%t:$LD_LIBRARY_PATH \ +// RUN: clang-repl -Xcc=-std=c++20 -Xcc=-fmodule-file=M=%t/mod.pcm \ +// RUN: | FileCheck %t/import.cpp + +//--- mod.cppm +export module M; +export const char* Hello() { + return "Hello Interpreter for Modules!"; +} + +//--- import.cpp + +%lib libmod.so + +import M; + +extern "C" int printf(const char *, ...); +printf("%s\n", Hello()); + +// CHECK: Hello Interpreter for Modules! _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits