| Index: src/sksl/SkSLParser.cpp | 
| diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp | 
| index 29f1dbd1785d425ef638312560272f27c02394ba..b240e4501e98a1f4847cd8c00ca784d854ee9a31 100644 | 
| --- a/src/sksl/SkSLParser.cpp | 
| +++ b/src/sksl/SkSLParser.cpp | 
| @@ -56,9 +56,7 @@ | 
| #include "ast/SkSLASTIndexSuffix.h" | 
| #include "ast/SkSLASTInterfaceBlock.h" | 
| #include "ast/SkSLASTIntLiteral.h" | 
| -#include "ast/SkSLASTModifiersDeclaration.h" | 
| #include "ast/SkSLASTParameter.h" | 
| -#include "ast/SkSLASTPrecision.h" | 
| #include "ast/SkSLASTPrefixExpression.h" | 
| #include "ast/SkSLASTReturnStatement.h" | 
| #include "ast/SkSLASTStatement.h" | 
| @@ -99,13 +97,9 @@ | 
| switch (this->peek().fKind) { | 
| case Token::END_OF_FILE: | 
| return result; | 
| -            case Token::PRECISION: { | 
| -                std::unique_ptr<ASTDeclaration> precision = this->precision(); | 
| -                if (precision) { | 
| -                    result.push_back(std::move(precision)); | 
| -                } | 
| -                break; | 
| -            } | 
| +            case Token::PRECISION: | 
| +                this->precision(); | 
| +                break; | 
| case Token::DIRECTIVE: { | 
| std::unique_ptr<ASTDeclaration> decl = this->directive(); | 
| if (decl) { | 
| @@ -169,37 +163,29 @@ | 
| } | 
|  | 
| /* PRECISION (LOWP | MEDIUMP | HIGHP) type SEMICOLON */ | 
| -std::unique_ptr<ASTDeclaration> Parser::precision() { | 
| +void Parser::precision() { | 
| if (!this->expect(Token::PRECISION, "'precision'")) { | 
| -        return nullptr; | 
| -    } | 
| -    Modifiers::Flag result; | 
| +        return; | 
| +    } | 
| Token p = this->nextToken(); | 
| switch (p.fKind) { | 
| -        case Token::LOWP: | 
| -            result = Modifiers::kLowp_Flag; | 
| -            break; | 
| -        case Token::MEDIUMP: | 
| -            result = Modifiers::kMediump_Flag; | 
| -            break; | 
| +        case Token::LOWP: // fall through | 
| +        case Token::MEDIUMP: // fall through | 
| case Token::HIGHP: | 
| -            result = Modifiers::kHighp_Flag; | 
| +            // ignored for now | 
| break; | 
| default: | 
| this->error(p.fPosition, "expected 'lowp', 'mediump', or 'highp', but found '" + | 
| p.fText + "'"); | 
| -            return nullptr; | 
| -    } | 
| -    // FIXME handle the type | 
| +            return; | 
| +    } | 
| if (!this->type()) { | 
| -        return nullptr; | 
| +        return; | 
| } | 
| this->expect(Token::SEMICOLON, "';'"); | 
| -    return std::unique_ptr<ASTDeclaration>(new ASTPrecision(p.fPosition, result)); | 
| -} | 
| - | 
| -/* DIRECTIVE(#version) INT_LITERAL ("es" | "compatibility")? | | 
| -   DIRECTIVE(#extension) IDENTIFIER COLON IDENTIFIER */ | 
| +} | 
| + | 
| +/* DIRECTIVE(#version) INT_LITERAL | DIRECTIVE(#extension) IDENTIFIER COLON IDENTIFIER */ | 
| std::unique_ptr<ASTDeclaration> Parser::directive() { | 
| Token start; | 
| if (!this->expect(Token::DIRECTIVE, "a directive", &start)) { | 
| @@ -207,12 +193,7 @@ | 
| } | 
| if (start.fText == "#version") { | 
| this->expect(Token::INT_LITERAL, "a version number"); | 
| -        Token next = this->peek(); | 
| -        if (next.fText == "es" || next.fText == "compatibility") { | 
| -            this->nextToken(); | 
| -        } | 
| -        // version is ignored for now; it will eventually become an error when we stop pretending | 
| -        // to be GLSL | 
| +        // ignored for now | 
| return nullptr; | 
| } else if (start.fText == "#extension") { | 
| Token name; | 
| @@ -245,10 +226,6 @@ | 
| } | 
| if (lookahead.fKind == Token::STRUCT) { | 
| return this->structVarDeclaration(modifiers); | 
| -    } | 
| -    if (lookahead.fKind == Token::SEMICOLON) { | 
| -        this->nextToken(); | 
| -        return std::unique_ptr<ASTDeclaration>(new ASTModifiersDeclaration(modifiers)); | 
| } | 
| std::unique_ptr<ASTType> type(this->type()); | 
| if (!type) { | 
| @@ -500,13 +477,10 @@ | 
| int set = -1; | 
| int builtin = -1; | 
| bool originUpperLeft = false; | 
| -    bool overrideCoverage = false; | 
| -    bool blendSupportAllEquations = false; | 
| if (this->peek().fKind == Token::LAYOUT) { | 
| this->nextToken(); | 
| if (!this->expect(Token::LPAREN, "'('")) { | 
| -            return ASTLayout(location, binding, index, set, builtin, originUpperLeft, | 
| -                             overrideCoverage, blendSupportAllEquations); | 
| +            return ASTLayout(location, binding, index, set, builtin, originUpperLeft); | 
| } | 
| for (;;) { | 
| Token t = this->nextToken(); | 
| @@ -522,10 +496,6 @@ | 
| builtin = this->layoutInt(); | 
| } else if (t.fText == "origin_upper_left") { | 
| originUpperLeft = true; | 
| -            } else if (t.fText == "override_coverage") { | 
| -                overrideCoverage = true; | 
| -            } else if (t.fText == "blend_support_all_equations") { | 
| -                blendSupportAllEquations = true; | 
| } else { | 
| this->error(t.fPosition, ("'" + t.fText + | 
| "' is not a valid layout qualifier").c_str()); | 
| @@ -539,8 +509,7 @@ | 
| } | 
| } | 
| } | 
| -    return ASTLayout(location, binding, index, set, builtin, originUpperLeft, overrideCoverage, | 
| -                     blendSupportAllEquations); | 
| +    return ASTLayout(location, binding, index, set, builtin, originUpperLeft); | 
| } | 
|  | 
| /* layout? (UNIFORM | CONST | IN | OUT | INOUT | LOWP | MEDIUMP | HIGHP | FLAT | NOPERSPECTIVE)* */ | 
| @@ -1242,11 +1211,10 @@ | 
| /* postfixExpression | (PLUS | MINUS | NOT | PLUSPLUS | MINUSMINUS) unaryExpression */ | 
| std::unique_ptr<ASTExpression> Parser::unaryExpression() { | 
| switch (this->peek().fKind) { | 
| -        case Token::PLUS:       // fall through | 
| -        case Token::MINUS:      // fall through | 
| -        case Token::LOGICALNOT: // fall through | 
| -        case Token::BITWISENOT: // fall through | 
| -        case Token::PLUSPLUS:   // fall through | 
| +        case Token::PLUS:     // fall through | 
| +        case Token::MINUS:    // fall through | 
| +        case Token::NOT:      // fall through | 
| +        case Token::PLUSPLUS: // fall through | 
| case Token::MINUSMINUS: { | 
| Token t = this->nextToken(); | 
| std::unique_ptr<ASTExpression> expr = this->unaryExpression(); | 
| @@ -1286,16 +1254,12 @@ | 
| } | 
| } | 
|  | 
| -/* LBRACKET expression? RBRACKET | DOT IDENTIFIER | LPAREN parameters RPAREN | | 
| +/* LBRACKET expression RBRACKET | DOT IDENTIFIER | LPAREN parameters RPAREN | | 
| PLUSPLUS | MINUSMINUS */ | 
| std::unique_ptr<ASTSuffix> Parser::suffix() { | 
| Token next = this->nextToken(); | 
| switch (next.fKind) { | 
| case Token::LBRACKET: { | 
| -            if (this->peek().fKind == Token::RBRACKET) { | 
| -                this->nextToken(); | 
| -                return std::unique_ptr<ASTSuffix>(new ASTIndexSuffix(next.fPosition)); | 
| -            } | 
| std::unique_ptr<ASTExpression> e = this->expression(); | 
| if (!e) { | 
| return nullptr; | 
|  |