From e4db67b523732bd315e4a8e395e3a2a7d86ddd74 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 20 May 2021 09:37:15 +0200 Subject: [PATCH] GLSL: Fix crash when built with Qt 6 In Qt 6 references (and pointers) to elements in a container are invalidated when the container size changes. Simply move to std::unordered_set which guarantees references to stay valid. Fixes: QTCREATORBUG-25641 Task-number: QTCREATORBUG-24098 Change-Id: I9f1110419bd2940c182b4a24629d9ab718ca2af6 Reviewed-by: David Schulz --- src/libs/glsl/glslengine.cpp | 12 ++++++------ src/libs/glsl/glslengine.h | 11 ++++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/libs/glsl/glslengine.cpp b/src/libs/glsl/glslengine.cpp index 8c03b69d792..9e305f07f2b 100644 --- a/src/libs/glsl/glslengine.cpp +++ b/src/libs/glsl/glslengine.cpp @@ -87,30 +87,30 @@ Engine::~Engine() const QString *Engine::identifier(const QString &s) { - return &(*_identifiers.insert(s)); + return &(*_identifiers.insert(s).first); } const QString *Engine::identifier(const char *s, int n) { - return &(*_identifiers.insert(QString::fromLatin1(s, n))); + return &(*_identifiers.insert(QString::fromLatin1(s, n)).first); } -QSet Engine::identifiers() const +std::unordered_set Engine::identifiers() const { return _identifiers; } const QString *Engine::number(const QString &s) { - return &(*_numbers.insert(s)); + return &(*_numbers.insert(s).first); } const QString *Engine::number(const char *s, int n) { - return &(*_numbers.insert(QString::fromLatin1(s, n))); + return &(*_numbers.insert(QString::fromLatin1(s, n)).first); } -QSet Engine::numbers() const +std::unordered_set Engine::numbers() const { return _numbers; } diff --git a/src/libs/glsl/glslengine.h b/src/libs/glsl/glslengine.h index 0942d5ef575..1444867131d 100644 --- a/src/libs/glsl/glslengine.h +++ b/src/libs/glsl/glslengine.h @@ -29,9 +29,10 @@ #include "glslmemorypool.h" #include "glsltypes.h" #include -#include + #include #include +#include namespace GLSL { @@ -91,11 +92,11 @@ public: const QString *identifier(const QString &s); const QString *identifier(const char *s, int n); - QSet identifiers() const; + std::unordered_set identifiers() const; const QString *number(const QString &s); const QString *number(const char *s, int n); - QSet numbers() const; + std::unordered_set numbers() const; // types const UndefinedType *undefinedType(); @@ -128,8 +129,8 @@ public: void error(int line, const QString &message); private: - QSet _identifiers; - QSet _numbers; + std::unordered_set _identifiers; + std::unordered_set _numbers; TypeTable _vectorTypes; TypeTable _matrixTypes; TypeTable _arrayTypes;