Edit

kc3-lang/angle/src/tests/compiler_tests/RewriteDoWhile_test.cpp

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2017-07-21 11:10:26
    Hash : 590f6235
    Message : Fix getting temporary id in RewriteDoWhile There's been a long-standing bug in RewriteDoWhile where it would only call nextTemporaryId() after it had created the temporary variable. This escalated into a null pointer dereference in the recent symbol table refactoring, and initializing the traverser with the symbol table was also missing. BUG=chromium:747244 TEST=angle_unittests Change-Id: I8987a609bb5d7d49e3c3e284fc42a2e53e38dafa Reviewed-on: https://chromium-review.googlesource.com/580887 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/tests/compiler_tests/RewriteDoWhile_test.cpp
  • //
    // Copyright (c) 2017 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // RewriteDoWhile_test.cpp:
    //   Tests that the RewriteDoWhile AST transform works correctly.
    //
    
    #include "GLSLANG/ShaderLang.h"
    #include "angle_gl.h"
    #include "gtest/gtest.h"
    #include "tests/test_utils/ShaderCompileTreeTest.h"
    
    using namespace sh;
    
    class RewriteDoWhileCrashTest : public ShaderCompileTreeTest
    {
      public:
        RewriteDoWhileCrashTest() {}
    
      protected:
        ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; }
        ShShaderSpec getShaderSpec() const override { return SH_GLES3_1_SPEC; }
    
        void SetUp() override
        {
            mExtraCompileOptions |= SH_REWRITE_DO_WHILE_LOOPS;
            ShaderCompileTreeTest::SetUp();
        }
    };
    
    // Make sure that the RewriteDoWhile step doesn't crash due to creating temp symbols before calling
    // nextTemporaryId(). Regression test.
    TEST_F(RewriteDoWhileCrashTest, RunsSuccessfully)
    {
        const std::string &shaderString =
            "#version 300 es\n"
            "precision mediump float;\n"
            "uniform int u;\n"
            "out vec4 my_FragColor;\n"
            "void main()\n"
            "{\n"
            "    int foo = 1;"
            "    do\n"
            "    {\n"
            "         foo *= u;\n"
            "    } while (foo < 8);\n"
            "    my_FragColor = vec4(foo) * 0.1;"
            "}\n";
        if (!compile(shaderString))
        {
            FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog;
        }
    }