diff --git a/clang/include/clang/AST/APValue.h b/clang/include/clang/AST/APValue.h index 5f4ac02f53c9a4..4e22d6c8443c5f 100644 --- a/clang/include/clang/AST/APValue.h +++ b/clang/include/clang/AST/APValue.h @@ -238,7 +238,7 @@ class APValue { } }; class LValuePathSerializationHelper { - const void *ElemTy; + const void *Ty; public: ArrayRef Path; diff --git a/clang/include/clang/AST/AbstractBasicReader.h b/clang/include/clang/AST/AbstractBasicReader.h index 3394c68f54ebe5..bb589fb337b3e0 100644 --- a/clang/include/clang/AST/AbstractBasicReader.h +++ b/clang/include/clang/AST/AbstractBasicReader.h @@ -190,7 +190,8 @@ class DataStreamBasicReader : public BasicReaderBase { APValue::LValuePathSerializationHelper readLValuePathSerializationHelper( SmallVectorImpl &path) { - auto elemTy = asImpl().readQualType(); + auto origTy = asImpl().readQualType(); + auto elemTy = origTy; unsigned pathLength = asImpl().readUInt32(); for (unsigned i = 0; i < pathLength; ++i) { if (elemTy->template getAs()) { @@ -208,7 +209,7 @@ class DataStreamBasicReader : public BasicReaderBase { APValue::LValuePathEntry::ArrayIndex(asImpl().readUInt32())); } } - return APValue::LValuePathSerializationHelper(path, elemTy); + return APValue::LValuePathSerializationHelper(path, origTy); } Qualifiers readQualifiers() { diff --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp index 634423008c2ed8..d583718c0eeb0c 100644 --- a/clang/lib/AST/APValue.cpp +++ b/clang/lib/AST/APValue.cpp @@ -156,10 +156,10 @@ void APValue::LValuePathEntry::Profile(llvm::FoldingSetNodeID &ID) const { APValue::LValuePathSerializationHelper::LValuePathSerializationHelper( ArrayRef Path, QualType ElemTy) - : ElemTy((const void *)ElemTy.getTypePtrOrNull()), Path(Path) {} + : Ty((const void *)ElemTy.getTypePtrOrNull()), Path(Path) {} QualType APValue::LValuePathSerializationHelper::getType() { - return QualType::getFromOpaquePtr(ElemTy); + return QualType::getFromOpaquePtr(Ty); } namespace { diff --git a/clang/test/Modules/pr58716.cppm b/clang/test/Modules/pr58716.cppm new file mode 100644 index 00000000000000..3f97fca7d5e8a3 --- /dev/null +++ b/clang/test/Modules/pr58716.cppm @@ -0,0 +1,46 @@ +// Tests that the compiler won't crash due to the consteval constructor. +// +// REQUIRES: x86-registered-target +// +// RUN: rm -rf %t +// RUN: mkdir -p %t +// RUN: split-file %s %t +// +// RUN: %clang_cc1 -triple=x86_64-linux-gnu -std=c++20 -emit-module-interface %t/m.cppm -o %t/m.pcm +// RUN: %clang_cc1 -triple=x86_64-linux-gnu -std=c++20 %t/m.pcm -S -emit-llvm -o - | FileCheck %t/m.cppm +// +//--- m.cppm +module; +#include "fail.h" +export module mymodule; + +// CHECK: @.str = {{.*}}"{}\00" +// CHECK: store{{.*}}ptr @.str + +//--- fail.h +namespace std { + +template +class basic_string_view { +public: + constexpr basic_string_view(const _CharT* __s) + : __data_(__s) {} + +private: + const _CharT* __data_; +}; + +template +struct basic_format_string { + template + consteval basic_format_string(const _Tp& __str) : __str_{__str} { + } + +private: + basic_string_view<_CharT> __str_; +}; +} + +auto this_fails() -> void { + std::basic_format_string __fmt("{}"); +}