Preprocessor related issue fix (#2378)
* Preprocessor related fix 1). Accoding to ESSL spec : All macro names containing two consecutive underscores ( __ ) are reserved for future use as predefined macro names, so just report a warning instead of error when the shader defines the macro names begining with '__'; 2. According to spec: If an implementation does not recognize the tokens following #pragma, then it will ignore that pragma, so report a compile-time warning intead of error for the following statement: #pragma debug(1.23) 3. The 'defined' macro should be allowed to expand and '__LINE__' should be allowed to be replaced with its original line number (otherwise, other expanding macros may change this value). 4. Add a flag 'indentifierSeen' in PPContext to indicate whether the any non-preprocessor tokens is existed before the extension directives, because the built-in symbols and functions are parsed before paring the user shader, so add a 'shaderSource' flag to check this error only for the user shader source; 5. Add missing type int16 and uint16. * Add test results, remove restriction of #extension. 1. Remove extension restriction in first line , as this is contraversy now. 2. The following shader is compiled failed as glslang consider the keyword 'defined' can not be undefined(in the 9th line: "#define defined BBB") The shader is as following: According to ES3.0 spec: It is an error to undefine or to redefine a built-in (pre-defined) macro name. This rule is aimed to the __LINE__, __FILE__, __VERSION__ and GL_ES, the keyword "defined" should not be restricted by this rule, so change the compile error to warning and make the following shader compile successfully. * 1. Using relaxedError to control error/warning report level. 2. remove #extension restriction. 3. Fix version related issue. 1. Using relaxedError to control error/warning report level. 2. remove #extension restriction. 3. Fix version related issue. * Add test results * Turn conditional warnings about pragma to unconditional ones.
This commit is contained in:
		
							parent
							
								
									ac2f01f4bd
								
							
						
					
					
						commit
						9eaa69c21c
					
				@ -246,7 +246,9 @@ void TParseContext::handlePragma(const TSourceLoc& loc, const TVector<TString>&
 | 
			
		||||
        else if (tokens[2].compare("off") == 0)
 | 
			
		||||
            contextPragma.optimize = false;
 | 
			
		||||
        else {
 | 
			
		||||
            error(loc, "\"on\" or \"off\" expected after '(' for 'optimize' pragma", "#pragma", "");
 | 
			
		||||
            if(relaxedErrors())
 | 
			
		||||
                //  If an implementation does not recognize the tokens following #pragma, then it will ignore that pragma.
 | 
			
		||||
                warn(loc, "\"on\" or \"off\" expected after '(' for 'optimize' pragma", "#pragma", "");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -270,7 +272,9 @@ void TParseContext::handlePragma(const TSourceLoc& loc, const TVector<TString>&
 | 
			
		||||
        else if (tokens[2].compare("off") == 0)
 | 
			
		||||
            contextPragma.debug = false;
 | 
			
		||||
        else {
 | 
			
		||||
            error(loc, "\"on\" or \"off\" expected after '(' for 'debug' pragma", "#pragma", "");
 | 
			
		||||
            if(relaxedErrors())
 | 
			
		||||
                //  If an implementation does not recognize the tokens following #pragma, then it will ignore that pragma.
 | 
			
		||||
                warn(loc, "\"on\" or \"off\" expected after '(' for 'debug' pragma", "#pragma", "");
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -2798,6 +2802,9 @@ void TParseContext::reservedPpErrorCheck(const TSourceLoc& loc, const char* iden
 | 
			
		||||
    if (strncmp(identifier, "GL_", 3) == 0)
 | 
			
		||||
        ppError(loc, "names beginning with \"GL_\" can't be (un)defined:", op,  identifier);
 | 
			
		||||
    else if (strncmp(identifier, "defined", 8) == 0)
 | 
			
		||||
        if (relaxedErrors())
 | 
			
		||||
            ppWarn(loc, "\"defined\" is (un)defined:", op,  identifier);
 | 
			
		||||
        else
 | 
			
		||||
            ppError(loc, "\"defined\" can't be (un)defined:", op,  identifier);
 | 
			
		||||
    else if (strstr(identifier, "__") != 0) {
 | 
			
		||||
        if (isEsProfile() && version >= 300 &&
 | 
			
		||||
@ -2806,7 +2813,7 @@ void TParseContext::reservedPpErrorCheck(const TSourceLoc& loc, const char* iden
 | 
			
		||||
             strcmp(identifier, "__VERSION__") == 0))
 | 
			
		||||
            ppError(loc, "predefined names can't be (un)defined:", op,  identifier);
 | 
			
		||||
        else {
 | 
			
		||||
            if (isEsProfile() && version < 300)
 | 
			
		||||
            if (isEsProfile() && version < 300 && !relaxedErrors())
 | 
			
		||||
                ppError(loc, "names containing consecutive underscores are reserved, and an error if version < 300:", op, identifier);
 | 
			
		||||
            else
 | 
			
		||||
                ppWarn(loc, "names containing consecutive underscores are reserved:", op, identifier);
 | 
			
		||||
 | 
			
		||||
@ -52,6 +52,14 @@
 | 
			
		||||
#define GL_UNSIGNED_INT64_VEC2_ARB        0x8FE5
 | 
			
		||||
#define GL_UNSIGNED_INT64_VEC3_ARB        0x8FE6
 | 
			
		||||
#define GL_UNSIGNED_INT64_VEC4_ARB        0x8FE7
 | 
			
		||||
#define GL_UNSIGNED_INT16_VEC2_NV         0x8FF1
 | 
			
		||||
#define GL_UNSIGNED_INT16_VEC3_NV         0x8FF2
 | 
			
		||||
#define GL_UNSIGNED_INT16_VEC4_NV         0x8FF3
 | 
			
		||||
 | 
			
		||||
#define GL_INT16_NV                       0x8FE4
 | 
			
		||||
#define GL_INT16_VEC2_NV                  0x8FE5
 | 
			
		||||
#define GL_INT16_VEC3_NV                  0x8FE6
 | 
			
		||||
#define GL_INT16_VEC4_NV                  0x8FE7
 | 
			
		||||
 | 
			
		||||
#define GL_BOOL                           0x8B56
 | 
			
		||||
#define GL_BOOL_VEC2                      0x8B57
 | 
			
		||||
 | 
			
		||||
@ -1184,6 +1184,8 @@ MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, b
 | 
			
		||||
    int macroAtom = atomStrings.getAtom(ppToken->name);
 | 
			
		||||
    switch (macroAtom) {
 | 
			
		||||
    case PpAtomLineMacro:
 | 
			
		||||
        // Arguments which are macro have been replaced in the first stage.
 | 
			
		||||
        if (ppToken->ival == 0)
 | 
			
		||||
            ppToken->ival = parseContext.getCurrentLoc().line;
 | 
			
		||||
        snprintf(ppToken->name, sizeof(ppToken->name), "%d", ppToken->ival);
 | 
			
		||||
        UngetToken(PpAtomConstInt, ppToken);
 | 
			
		||||
@ -1285,6 +1287,11 @@ MacroExpandResult TPpContext::MacroExpand(TPpToken* ppToken, bool expandUndef, b
 | 
			
		||||
                    nestStack.push_back('}');
 | 
			
		||||
                else if (nestStack.size() > 0 && token == nestStack.back())
 | 
			
		||||
                    nestStack.pop_back();
 | 
			
		||||
 | 
			
		||||
                //Macro replacement list is expanded in the last stage.
 | 
			
		||||
                if (atomStrings.getAtom(ppToken->name) == PpAtomLineMacro)
 | 
			
		||||
                    ppToken->ival = parseContext.getCurrentLoc().line;
 | 
			
		||||
 | 
			
		||||
                in->args[arg]->putToken(token, ppToken);
 | 
			
		||||
                tokenRecorded = true;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user