office-gobmx/external/skia/constexpr-template.patch.0
Stephan Bergmann 3307e4ae55 external/skia: Address a constexpr template point of instantiation issue
...that hits at least when building with Clang and --with-latest-c++ against
recent libc++ or MSVC standard library (where C++20 and esp. C++23 made more and
more class template member functions constexpr).  My understanding is that there
is some leeway at what point a compiler should instantiate such function
specializations, and Clang decides to instantiate constexpr ones early (cf.
<242ad89a15>
"C++11 half of r147023: In C++11, additionally eagerly instantiate:" and its "Do
not defer instantiations of constexpr functions" comment, and the discussion at
<https://discourse.llvm.org/t/point-of-instantiation-of-constexpr-function-template/65129>).

> In file included from workdir/UnpackedTarball/skia/src/sksl/dsl/DSLFunction.cpp:8:
> In file included from workdir/UnpackedTarball/skia/include/sksl/DSLFunction.h:11:
> In file included from workdir/UnpackedTarball/skia/include/private/SkSLDefines.h:14:
> In file included from workdir/UnpackedTarball/skia/include/private/SkTArray.h:16:
> In file included from workdir/UnpackedTarball/skia/include/private/SkTemplates.h:18:
> In file included from ~/llvm/inst/bin/../include/c++/v1/memory:881:
> In file included from ~/llvm/inst/bin/../include/c++/v1/__memory/shared_ptr.h:30:
> ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:47:19: error: invalid application of 'sizeof' to an incomplete type 'SkSL::Expression'
>     static_assert(sizeof(_Tp) >= 0, "cannot delete an incomplete type");
>                   ^~~~~~~~~~~
> ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:281:7: note: in instantiation of member function 'std::default_delete<SkSL::Expression>::operator()' requested here
>       __ptr_.second()(__tmp);
>       ^
> ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:247:75: note: in instantiation of member function 'std::unique_ptr<SkSL::Expression>::reset' requested here
>   _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 ~unique_ptr() { reset(); }
>                                                                           ^
> workdir/UnpackedTarball/skia/include/sksl/DSLFunction.h💯43: note: in instantiation of member function 'std::unique_ptr<SkSL::Expression>::~unique_ptr' requested here
>         args.push_back(DSLExpression(var).release());
>                                           ^
> workdir/UnpackedTarball/skia/include/private/SkSLDefines.h:21:7: note: forward declaration of 'SkSL::Expression'
> class Expression;
>       ^

and

> In file included from workdir/UnpackedTarball/skia/src/sksl/dsl/DSLVar.cpp:8:
> In file included from workdir/UnpackedTarball/skia/include/sksl/DSLVar.h:11:
> In file included from workdir/UnpackedTarball/skia/include/sksl/DSLExpression.h:11:
> In file included from workdir/UnpackedTarball/skia/include/private/SkTArray.h:16:
> In file included from workdir/UnpackedTarball/skia/include/private/SkTemplates.h:18:
> In file included from ~/llvm/inst/bin/../include/c++/v1/memory:881:
> In file included from ~/llvm/inst/bin/../include/c++/v1/__memory/shared_ptr.h:30:
> ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:47:19: error: invalid application of 'sizeof' to an incomplete type 'SkSL::Statement'
>     static_assert(sizeof(_Tp) >= 0, "cannot delete an incomplete type");
>                   ^~~~~~~~~~~
> ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:281:7: note: in instantiation of member function 'std::default_delete<SkSL::Statement>::operator()' requested here
>       __ptr_.second()(__tmp);
>       ^
> ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:247:75: note: in instantiation of member function 'std::unique_ptr<SkSL::Statement>::reset' requested here
>   _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 ~unique_ptr() { reset(); }
>                                                                           ^
> workdir/UnpackedTarball/skia/include/sksl/DSLVar.h:38:5: note: in instantiation of member function 'std::unique_ptr<SkSL::Statement>::~unique_ptr' requested here
>     DSLVarBase() : fType(kVoid_Type), fDeclared(true) {}
>     ^
> workdir/UnpackedTarball/skia/include/private/SkSLDefines.h:22:7: note: forward declaration of 'SkSL::Statement'
> class Statement;
>       ^

and

> In file included from workdir/UnpackedTarball/skia/src/gpu/ganesh/effects/GrBlendFragmentProcessor.cpp:8:
> In file included from workdir/UnpackedTarball/skia/src/gpu/ganesh/effects/GrBlendFragmentProcessor.h:12:
> In file included from workdir/UnpackedTarball/skia/include/core/SkRefCnt.h:16:
> In file included from ~/llvm/inst/bin/../include/c++/v1/memory:881:
> In file included from ~/llvm/inst/bin/../include/c++/v1/__memory/shared_ptr.h:30:
> ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:47:19: error: invalid application of 'sizeof' to an incomplete type 'GrFragmentProcessor'
>     static_assert(sizeof(_Tp) >= 0, "cannot delete an incomplete type");
>                   ^~~~~~~~~~~
> ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:281:7: note: in instantiation of member function 'std::default_delete<GrFragmentProcessor>::operator()' requested here
>       __ptr_.second()(__tmp);
>       ^
> ~/llvm/inst/bin/../include/c++/v1/__memory/unique_ptr.h:247:75: note: in instantiation of member function 'std::unique_ptr<GrFragmentProcessor>::reset' requested here
>   _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX23 ~unique_ptr() { reset(); }
>                                                                           ^
> workdir/UnpackedTarball/skia/src/gpu/ganesh/effects/GrBlendFragmentProcessor.h:36:17: note: in instantiation of member function 'std::unique_ptr<GrFragmentProcessor>::~unique_ptr' requested here
>     return Make(std::move(src), std::move(dst), mode, /*shareBlendLogic=*/false);
>                 ^
> workdir/UnpackedTarball/skia/src/gpu/ganesh/effects/GrBlendFragmentProcessor.h:14:7: note: forward declaration of 'GrFragmentProcessor'
> class GrFragmentProcessor;
>       ^

Change-Id: I47f7280af3de7ed7b1915d4e5d2f7b52e4f26a9a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/141815
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2022-10-25 16:23:24 +02:00

72 lines
2.4 KiB
Text

--- include/sksl/DSLFunction.h
+++ include/sksl/DSLFunction.h
@@ -93,17 +93,20 @@
DSLExpression call(ExpressionArray args, Position pos = {});
private:
+ static void push_back(ExpressionArray& args, DSLExpression& expr);
+
void collectArgs(ExpressionArray& args) {}
template<class... RemainingArgs>
void collectArgs(ExpressionArray& args, DSLVar& var, RemainingArgs&&... remaining) {
- args.push_back(DSLExpression(var).release());
+ DSLExpression expr(var);
+ push_back(args, expr);
collectArgs(args, std::forward<RemainingArgs>(remaining)...);
}
template<class... RemainingArgs>
void collectArgs(ExpressionArray& args, DSLExpression expr, RemainingArgs&&... remaining) {
- args.push_back(expr.release());
+ push_back(args, expr);
collectArgs(args, std::forward<RemainingArgs>(remaining)...);
}
--- include/sksl/DSLVar.h
+++ include/sksl/DSLVar.h
@@ -35,7 +35,7 @@
/**
* Creates an empty, unpopulated var. Can be replaced with a real var later via `swap`.
*/
- DSLVarBase() : fType(kVoid_Type), fDeclared(true) {}
+ DSLVarBase();
/**
* Constructs a new variable with the specified type and name. The name is used (in mangled
--- src/gpu/ganesh/effects/GrBlendFragmentProcessor.h
+++ src/gpu/ganesh/effects/GrBlendFragmentProcessor.h
@@ -10,8 +10,7 @@
#include "include/core/SkBlendMode.h"
#include "include/core/SkRefCnt.h"
-
-class GrFragmentProcessor;
+#include "src/gpu/ganesh/GrFragmentProcessor.h"
namespace GrBlendFragmentProcessor {
--- src/sksl/dsl/DSLFunction.cpp
+++ src/sksl/dsl/DSLFunction.cpp
@@ -34,6 +34,10 @@
namespace dsl {
+void DSLFunction::push_back(ExpressionArray& args, DSLExpression& expr) {
+ args.push_back(expr.release());
+}
+
void DSLFunction::init(DSLModifiers modifiers, const DSLType& returnType, std::string_view name,
SkTArray<DSLParameter*> params, Position pos) {
fPosition = pos;
--- src/sksl/dsl/DSLVar.cpp
+++ src/sksl/dsl/DSLVar.cpp
@@ -46,6 +46,8 @@
namespace dsl {
+DSLVarBase::DSLVarBase() : fType(kVoid_Type), fDeclared(true) {}
+
DSLVarBase::DSLVarBase(DSLType type, std::string_view name, DSLExpression initialValue,
Position pos, Position namePos)
: DSLVarBase(DSLModifiers(), std::move(type), name, std::move(initialValue), pos, namePos) {}