| // 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 |