Edit

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

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2017-03-31 23:04:23
    Hash : 9ec79391
    Message : Use TLValueTrackingTraverser in ValidateLimitations Use TLValueTrackingTraverser to determine whether a loop index is used as an l-value. This replaces custom logic in ValidateLimitations, greatly simplifying the code. Also pass the symbol table to ValidateLimitations as a parameter, which removes the need to store a global pointer to the current ParseContext. BUG=angleproject:1960 TEST=angle_unittests, WebGL conformance tests Change-Id: I122c85c78bbea05833d7c787cd184de568c5c45f Reviewed-on: https://chromium-review.googlesource.com/465606 Commit-Queue: Olli Etuaho <oetuaho@nvidia.com> Reviewed-by: Corentin Wallez <cwallez@chromium.org>

  • src/tests/compiler_tests/AppendixALimitations_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.
    //
    // AppendixALimitations_test.cpp:
    //   Tests for validating ESSL 1.00 Appendix A limitations.
    //
    
    #include "gtest/gtest.h"
    
    #include "angle_gl.h"
    #include "gtest/gtest.h"
    #include "GLSLANG/ShaderLang.h"
    #include "tests/test_utils/ShaderCompileTreeTest.h"
    
    using namespace sh;
    
    class AppendixALimitationsTest : public ShaderCompileTreeTest
    {
      public:
        AppendixALimitationsTest() {}
      protected:
        ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; }
        ShShaderSpec getShaderSpec() const override { return SH_WEBGL_SPEC; }
    };
    
    // Test an invalid shader where a for loop index is used as an out parameter.
    TEST_F(AppendixALimitationsTest, IndexAsFunctionOutParameter)
    {
        const std::string &shaderString =
            "precision mediump float;\n"
            "void fun(out int a)\n"
            "{\n"
            "   a = 2;\n"
            "}\n"
            "void main()\n"
            "{\n"
            "    for (int i = 0; i < 2; ++i)\n"
            "    {\n"
            "        fun(i);\n"
            "    }\n"
            "    gl_FragColor = vec4(0.0);\n"
            "}\n";
        if (compile(shaderString))
        {
            FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
        }
    }
    
    // Test an invalid shader where a for loop index is used as an inout parameter.
    TEST_F(AppendixALimitationsTest, IndexAsFunctionInOutParameter)
    {
        const std::string &shaderString =
            "precision mediump float;\n"
            "void fun(int b, inout int a)\n"
            "{\n"
            "   a += b;\n"
            "}\n"
            "void main()\n"
            "{\n"
            "    for (int i = 0; i < 2; ++i)\n"
            "    {\n"
            "        fun(2, i);\n"
            "    }\n"
            "    gl_FragColor = vec4(0.0);\n"
            "}\n";
        if (compile(shaderString))
        {
            FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
        }
    }
    
    // Test a valid shader where a for loop index is used as an in parameter in a function that also has
    // an out parameter.
    TEST_F(AppendixALimitationsTest, IndexAsFunctionInParameter)
    {
        const std::string &shaderString =
            "precision mediump float;\n"
            "void fun(int b, inout int a)\n"
            "{\n"
            "   a += b;\n"
            "}\n"
            "void main()\n"
            "{\n"
            "    for (int i = 0; i < 2; ++i)\n"
            "    {\n"
            "        int a = 1;"
            "        fun(i, a);\n"
            "    }\n"
            "    gl_FragColor = vec4(0.0);\n"
            "}\n";
        if (!compile(shaderString))
        {
            FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog;
        }
    }
    
    // Test an invalid shader where a for loop index is used as a target of assignment.
    TEST_F(AppendixALimitationsTest, IndexAsTargetOfAssignment)
    {
        const std::string &shaderString =
            "precision mediump float;\n"
            "void main()\n"
            "{\n"
            "    for (int i = 0; i < 2; ++i)\n"
            "    {\n"
            "        i = 2;\n"
            "    }\n"
            "    gl_FragColor = vec4(0.0);\n"
            "}\n";
        if (compile(shaderString))
        {
            FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
        }
    }
    
    // Test an invalid shader where a for loop index is incremented inside the loop.
    TEST_F(AppendixALimitationsTest, IndexIncrementedInLoopBody)
    {
        const std::string &shaderString =
            "precision mediump float;\n"
            "void main()\n"
            "{\n"
            "    for (int i = 0; i < 2; ++i)\n"
            "    {\n"
            "        ++i;\n"
            "    }\n"
            "    gl_FragColor = vec4(0.0);\n"
            "}\n";
        if (compile(shaderString))
        {
            FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
        }
    }