1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2012 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/DiagnosticsBase.h" 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h" 10*8975f5c5SAndroid Build Coastguard Worker 11*8975f5c5SAndroid Build Coastguard Worker namespace angle 12*8975f5c5SAndroid Build Coastguard Worker { 13*8975f5c5SAndroid Build Coastguard Worker 14*8975f5c5SAndroid Build Coastguard Worker namespace pp 15*8975f5c5SAndroid Build Coastguard Worker { 16*8975f5c5SAndroid Build Coastguard Worker ~Diagnostics()17*8975f5c5SAndroid Build Coastguard WorkerDiagnostics::~Diagnostics() {} 18*8975f5c5SAndroid Build Coastguard Worker report(ID id,const SourceLocation & loc,const std::string & text)19*8975f5c5SAndroid Build Coastguard Workervoid Diagnostics::report(ID id, const SourceLocation &loc, const std::string &text) 20*8975f5c5SAndroid Build Coastguard Worker { 21*8975f5c5SAndroid Build Coastguard Worker print(id, loc, text); 22*8975f5c5SAndroid Build Coastguard Worker } 23*8975f5c5SAndroid Build Coastguard Worker isError(ID id)24*8975f5c5SAndroid Build Coastguard Workerbool Diagnostics::isError(ID id) 25*8975f5c5SAndroid Build Coastguard Worker { 26*8975f5c5SAndroid Build Coastguard Worker if ((id > PP_ERROR_BEGIN) && (id < PP_ERROR_END)) 27*8975f5c5SAndroid Build Coastguard Worker return true; 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker if ((id > PP_WARNING_BEGIN) && (id < PP_WARNING_END)) 30*8975f5c5SAndroid Build Coastguard Worker return false; 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE(); 33*8975f5c5SAndroid Build Coastguard Worker return true; 34*8975f5c5SAndroid Build Coastguard Worker } 35*8975f5c5SAndroid Build Coastguard Worker message(ID id)36*8975f5c5SAndroid Build Coastguard Workerconst char *Diagnostics::message(ID id) 37*8975f5c5SAndroid Build Coastguard Worker { 38*8975f5c5SAndroid Build Coastguard Worker switch (id) 39*8975f5c5SAndroid Build Coastguard Worker { 40*8975f5c5SAndroid Build Coastguard Worker // Errors begin. 41*8975f5c5SAndroid Build Coastguard Worker case PP_INTERNAL_ERROR: 42*8975f5c5SAndroid Build Coastguard Worker return "internal error"; 43*8975f5c5SAndroid Build Coastguard Worker case PP_OUT_OF_MEMORY: 44*8975f5c5SAndroid Build Coastguard Worker return "out of memory"; 45*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_CHARACTER: 46*8975f5c5SAndroid Build Coastguard Worker return "invalid character"; 47*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_NUMBER: 48*8975f5c5SAndroid Build Coastguard Worker return "invalid number"; 49*8975f5c5SAndroid Build Coastguard Worker case PP_INTEGER_OVERFLOW: 50*8975f5c5SAndroid Build Coastguard Worker return "integer overflow"; 51*8975f5c5SAndroid Build Coastguard Worker case PP_FLOAT_OVERFLOW: 52*8975f5c5SAndroid Build Coastguard Worker return "float overflow"; 53*8975f5c5SAndroid Build Coastguard Worker case PP_TOKEN_TOO_LONG: 54*8975f5c5SAndroid Build Coastguard Worker return "token too long"; 55*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_EXPRESSION: 56*8975f5c5SAndroid Build Coastguard Worker return "invalid expression"; 57*8975f5c5SAndroid Build Coastguard Worker case PP_DIVISION_BY_ZERO: 58*8975f5c5SAndroid Build Coastguard Worker return "division by zero"; 59*8975f5c5SAndroid Build Coastguard Worker case PP_EOF_IN_COMMENT: 60*8975f5c5SAndroid Build Coastguard Worker return "unexpected end of file found in comment"; 61*8975f5c5SAndroid Build Coastguard Worker case PP_UNEXPECTED_TOKEN: 62*8975f5c5SAndroid Build Coastguard Worker return "unexpected token"; 63*8975f5c5SAndroid Build Coastguard Worker case PP_DIRECTIVE_INVALID_NAME: 64*8975f5c5SAndroid Build Coastguard Worker return "invalid directive name"; 65*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_NAME_RESERVED: 66*8975f5c5SAndroid Build Coastguard Worker return "macro name is reserved"; 67*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_REDEFINED: 68*8975f5c5SAndroid Build Coastguard Worker return "macro redefined"; 69*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_PREDEFINED_REDEFINED: 70*8975f5c5SAndroid Build Coastguard Worker return "predefined macro redefined"; 71*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_PREDEFINED_UNDEFINED: 72*8975f5c5SAndroid Build Coastguard Worker return "predefined macro undefined"; 73*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_UNTERMINATED_INVOCATION: 74*8975f5c5SAndroid Build Coastguard Worker return "unterminated macro invocation"; 75*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_UNDEFINED_WHILE_INVOKED: 76*8975f5c5SAndroid Build Coastguard Worker return "macro undefined while being invoked"; 77*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_TOO_FEW_ARGS: 78*8975f5c5SAndroid Build Coastguard Worker return "Not enough arguments for macro"; 79*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_TOO_MANY_ARGS: 80*8975f5c5SAndroid Build Coastguard Worker return "Too many arguments for macro"; 81*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_DUPLICATE_PARAMETER_NAMES: 82*8975f5c5SAndroid Build Coastguard Worker return "duplicate macro parameter name"; 83*8975f5c5SAndroid Build Coastguard Worker case PP_MACRO_INVOCATION_CHAIN_TOO_DEEP: 84*8975f5c5SAndroid Build Coastguard Worker return "macro invocation chain too deep"; 85*8975f5c5SAndroid Build Coastguard Worker case PP_CONDITIONAL_ENDIF_WITHOUT_IF: 86*8975f5c5SAndroid Build Coastguard Worker return "unexpected #endif found without a matching #if"; 87*8975f5c5SAndroid Build Coastguard Worker case PP_CONDITIONAL_ELSE_WITHOUT_IF: 88*8975f5c5SAndroid Build Coastguard Worker return "unexpected #else found without a matching #if"; 89*8975f5c5SAndroid Build Coastguard Worker case PP_CONDITIONAL_ELSE_AFTER_ELSE: 90*8975f5c5SAndroid Build Coastguard Worker return "unexpected #else found after another #else"; 91*8975f5c5SAndroid Build Coastguard Worker case PP_CONDITIONAL_ELIF_WITHOUT_IF: 92*8975f5c5SAndroid Build Coastguard Worker return "unexpected #elif found without a matching #if"; 93*8975f5c5SAndroid Build Coastguard Worker case PP_CONDITIONAL_ELIF_AFTER_ELSE: 94*8975f5c5SAndroid Build Coastguard Worker return "unexpected #elif found after #else"; 95*8975f5c5SAndroid Build Coastguard Worker case PP_CONDITIONAL_UNTERMINATED: 96*8975f5c5SAndroid Build Coastguard Worker return "unexpected end of file found in conditional block"; 97*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_EXTENSION_NAME: 98*8975f5c5SAndroid Build Coastguard Worker return "invalid extension name"; 99*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_EXTENSION_BEHAVIOR: 100*8975f5c5SAndroid Build Coastguard Worker return "invalid extension behavior"; 101*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_EXTENSION_DIRECTIVE: 102*8975f5c5SAndroid Build Coastguard Worker return "invalid extension directive"; 103*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_VERSION_NUMBER: 104*8975f5c5SAndroid Build Coastguard Worker return "invalid version number"; 105*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_VERSION_DIRECTIVE: 106*8975f5c5SAndroid Build Coastguard Worker return "invalid version directive"; 107*8975f5c5SAndroid Build Coastguard Worker case PP_VERSION_NOT_FIRST_STATEMENT: 108*8975f5c5SAndroid Build Coastguard Worker return "#version directive must occur before anything else, " 109*8975f5c5SAndroid Build Coastguard Worker "except for comments and white space"; 110*8975f5c5SAndroid Build Coastguard Worker case PP_VERSION_NOT_FIRST_LINE_ESSL3: 111*8975f5c5SAndroid Build Coastguard Worker return "#version directive must occur on the first line of the shader"; 112*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_LINE_NUMBER: 113*8975f5c5SAndroid Build Coastguard Worker return "invalid line number"; 114*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_FILE_NUMBER: 115*8975f5c5SAndroid Build Coastguard Worker return "invalid file number"; 116*8975f5c5SAndroid Build Coastguard Worker case PP_INVALID_LINE_DIRECTIVE: 117*8975f5c5SAndroid Build Coastguard Worker return "invalid line directive"; 118*8975f5c5SAndroid Build Coastguard Worker case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1: 119*8975f5c5SAndroid Build Coastguard Worker return "extension directive must occur before any non-preprocessor tokens in ESSL1"; 120*8975f5c5SAndroid Build Coastguard Worker case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3: 121*8975f5c5SAndroid Build Coastguard Worker return "extension directive must occur before any non-preprocessor tokens in ESSL3"; 122*8975f5c5SAndroid Build Coastguard Worker case PP_UNDEFINED_SHIFT: 123*8975f5c5SAndroid Build Coastguard Worker return "shift exponent is negative or undefined"; 124*8975f5c5SAndroid Build Coastguard Worker case PP_TOKENIZER_ERROR: 125*8975f5c5SAndroid Build Coastguard Worker return "internal tokenizer error"; 126*8975f5c5SAndroid Build Coastguard Worker // Errors end. 127*8975f5c5SAndroid Build Coastguard Worker // Warnings begin. 128*8975f5c5SAndroid Build Coastguard Worker case PP_EOF_IN_DIRECTIVE: 129*8975f5c5SAndroid Build Coastguard Worker return "unexpected end of file found in directive"; 130*8975f5c5SAndroid Build Coastguard Worker case PP_CONDITIONAL_UNEXPECTED_TOKEN: 131*8975f5c5SAndroid Build Coastguard Worker return "unexpected token after conditional expression"; 132*8975f5c5SAndroid Build Coastguard Worker case PP_UNRECOGNIZED_PRAGMA: 133*8975f5c5SAndroid Build Coastguard Worker return "unrecognized pragma"; 134*8975f5c5SAndroid Build Coastguard Worker case PP_NON_PP_TOKEN_BEFORE_EXTENSION_WEBGL: 135*8975f5c5SAndroid Build Coastguard Worker return "extension directive should occur before any non-preprocessor tokens"; 136*8975f5c5SAndroid Build Coastguard Worker case PP_WARNING_MACRO_NAME_RESERVED: 137*8975f5c5SAndroid Build Coastguard Worker return "macro name with a double underscore is reserved - unintented behavior is " 138*8975f5c5SAndroid Build Coastguard Worker "possible"; 139*8975f5c5SAndroid Build Coastguard Worker // Warnings end. 140*8975f5c5SAndroid Build Coastguard Worker default: 141*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE(); 142*8975f5c5SAndroid Build Coastguard Worker return ""; 143*8975f5c5SAndroid Build Coastguard Worker } 144*8975f5c5SAndroid Build Coastguard Worker } 145*8975f5c5SAndroid Build Coastguard Worker 146*8975f5c5SAndroid Build Coastguard Worker } // namespace pp 147*8975f5c5SAndroid Build Coastguard Worker 148*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 149