// Copyright 2017 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "DiagnosticsBase.h" #include <cassert> namespace pp { Diagnostics::~Diagnostics() { } void Diagnostics::report(ID id, const SourceLocation &loc, const std::string &text) { print(id, loc, text); } bool Diagnostics::isError(ID id) { if ((id > PP_ERROR_BEGIN) && (id < PP_ERROR_END)) return true; if ((id > PP_WARNING_BEGIN) && (id < PP_WARNING_END)) return false; assert(false); return true; } Diagnostics::Severity Diagnostics::severity(ID id) { if((id > PP_ERROR_BEGIN) && (id < PP_ERROR_END)) return PP_ERROR; if((id > PP_WARNING_BEGIN) && (id < PP_WARNING_END)) return PP_WARNING; assert(false); return PP_ERROR; } const char *Diagnostics::message(ID id) { switch (id) { // Errors begin. case PP_INTERNAL_ERROR: return "internal error"; case PP_OUT_OF_MEMORY: return "out of memory"; case PP_INVALID_CHARACTER: return "invalid character"; case PP_INVALID_NUMBER: return "invalid number"; case PP_INTEGER_OVERFLOW: return "integer overflow"; case PP_FLOAT_OVERFLOW: return "float overflow"; case PP_TOKEN_TOO_LONG: return "token too long"; case PP_INVALID_EXPRESSION: return "invalid expression"; case PP_DIVISION_BY_ZERO: return "division by zero"; case PP_EOF_IN_COMMENT: return "unexpected end of file found in comment"; case PP_UNEXPECTED_TOKEN: return "unexpected token"; case PP_DIRECTIVE_INVALID_NAME: return "invalid directive name"; case PP_MACRO_NAME_RESERVED: return "macro name is reserved"; case PP_MACRO_REDEFINED: return "macro redefined"; case PP_MACRO_PREDEFINED_REDEFINED: return "predefined macro redefined"; case PP_MACRO_PREDEFINED_UNDEFINED: return "predefined macro undefined"; case PP_MACRO_UNTERMINATED_INVOCATION: return "unterminated macro invocation"; case PP_MACRO_UNDEFINED_WHILE_INVOKED: return "macro undefined while being invoked"; case PP_MACRO_TOO_FEW_ARGS: return "Not enough arguments for macro"; case PP_MACRO_TOO_MANY_ARGS: return "Too many arguments for macro"; case PP_MACRO_DUPLICATE_PARAMETER_NAMES: return "duplicate macro parameter name"; case PP_MACRO_INVOCATION_CHAIN_TOO_DEEP: return "macro invocation chain too deep"; case PP_CONDITIONAL_ENDIF_WITHOUT_IF: return "unexpected #endif found without a matching #if"; case PP_CONDITIONAL_ELSE_WITHOUT_IF: return "unexpected #else found without a matching #if"; case PP_CONDITIONAL_ELSE_AFTER_ELSE: return "unexpected #else found after another #else"; case PP_CONDITIONAL_ELIF_WITHOUT_IF: return "unexpected #elif found without a matching #if"; case PP_CONDITIONAL_ELIF_AFTER_ELSE: return "unexpected #elif found after #else"; case PP_CONDITIONAL_UNTERMINATED: return "unexpected end of file found in conditional block"; case PP_INVALID_EXTENSION_NAME: return "invalid extension name"; case PP_INVALID_EXTENSION_BEHAVIOR: return "invalid extension behavior"; case PP_INVALID_EXTENSION_DIRECTIVE: return "invalid extension directive"; case PP_INVALID_VERSION_NUMBER: return "invalid version number"; case PP_INVALID_VERSION_DIRECTIVE: return "invalid version directive"; case PP_VERSION_NOT_FIRST_STATEMENT: return "#version directive must occur before anything else, " "except for comments and white space"; case PP_VERSION_NOT_FIRST_LINE_ESSL3: return "#version directive must occur on the first line of the shader"; case PP_INVALID_LINE_NUMBER: return "invalid line number"; case PP_INVALID_FILE_NUMBER: return "invalid file number"; case PP_INVALID_LINE_DIRECTIVE: return "invalid line directive"; case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL3: return "extension directive must occur before any non-preprocessor tokens in ESSL3"; case PP_UNDEFINED_SHIFT: return "shift exponent is negative or undefined"; case PP_TOKENIZER_ERROR: return "internal tokenizer error"; // Errors end. // Warnings begin. case PP_EOF_IN_DIRECTIVE: return "unexpected end of file found in directive"; case PP_CONDITIONAL_UNEXPECTED_TOKEN: return "unexpected token after conditional expression"; case PP_UNRECOGNIZED_PRAGMA: return "unrecognized pragma"; case PP_NON_PP_TOKEN_BEFORE_EXTENSION_ESSL1: return "extension directive should occur before any non-preprocessor tokens"; case PP_WARNING_MACRO_NAME_RESERVED: return "macro name with a double underscore is reserved - unintented behavior is " "possible"; // Warnings end. default: assert(false); return ""; } } } // namespace pp