diff --git a/Test/baseResults/120.frag.out b/Test/baseResults/120.frag.out
index b516724752761e235329093ee1fa7e426b401517..874c54e842badc2b591fafc423b61a20f9be703a 100644
--- a/Test/baseResults/120.frag.out
+++ b/Test/baseResults/120.frag.out
@@ -52,8 +52,10 @@ ERROR: 0:209: 'assign' :  cannot convert from ' const float' to ' temp 4-compone
 ERROR: 0:212: 'sampler2DRect' : Reserved word. 
 ERROR: 0:244: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type ' global void' and a right operand of type ' const int' (or there is no acceptable conversion)
 ERROR: 0:245: ':' :  wrong operand types: no operation ':' exists that takes a left-hand operand of type ' const int' and a right operand of type ' global void' (or there is no acceptable conversion)
+ERROR: 0:248: 'shader half float' : required extension not requested: GL_AMD_gpu_shader_half_float
+ERROR: 0:248: 'half floating-point suffix' : not supported with this profile: none
 ERROR: 0:248: '' :  syntax error, unexpected IDENTIFIER, expecting COMMA or SEMICOLON
-ERROR: 54 compilation errors.  No code generated.
+ERROR: 56 compilation errors.  No code generated.
 
 
 Shader version: 120
diff --git a/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
index 9fed80b6a624e448c5375f8f58dbdbcc058d02db..ccb39306841d25d313bf6c2bbcc72f3a7cb9662d 100644
--- a/glslang/MachineIndependent/preprocessor/PpScanner.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
@@ -103,17 +103,6 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
 {
     bool HasDecimalOrExponent = false;
     int isDouble = 0;
-    bool generateFloat16 = false;
-    bool acceptFloat16 = parseContext.intermediate.getSource() == EShSourceHlsl;
-    bool isFloat16 = false;
-    bool requireHF = false;
-#ifdef AMD_EXTENSIONS
-    if (parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float)) {
-        acceptFloat16 = true;
-        generateFloat16 = true;
-        requireHF = true;
-    }
-#endif
 
     const auto saveName = [&](int ch) {
         if (len <= MaxTokenLength)
@@ -182,7 +171,7 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
     }
 
     // Suffix:
-
+    bool isFloat16 = false;
     if (ch == 'l' || ch == 'L') {
         parseContext.doubleCheck(ppToken->loc, "double floating-point suffix");
         if (! HasDecimalOrExponent)
@@ -196,14 +185,14 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
             saveName(ch2);
             isDouble = 1;
         }
-    } else if (acceptFloat16 && (ch == 'h' || ch == 'H')) {
+    } else if (ch == 'h' || ch == 'H') {
 #ifdef AMD_EXTENSIONS
-        if (generateFloat16)
+        if (parseContext.intermediate.getSource() == EShSourceGlsl)
             parseContext.float16Check(ppToken->loc, "half floating-point suffix");
 #endif
         if (!HasDecimalOrExponent)
             parseContext.ppError(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
-        if (requireHF) {
+        if (parseContext.intermediate.getSource() == EShSourceGlsl) {
             int ch2 = getChar();
             if (ch2 != 'f' && ch2 != 'F') {
                 ungetChar();
@@ -211,11 +200,11 @@ int TPpContext::lFloatConst(int len, int ch, TPpToken* ppToken)
             } else {
                 saveName(ch);
                 saveName(ch2);
-                isFloat16 = generateFloat16;
+                isFloat16 = true;
             }
         } else {
             saveName(ch);
-            isFloat16 = generateFloat16;
+            isFloat16 = false;
         }
     } else if (ch == 'f' || ch == 'F') {
         parseContext.profileRequires(ppToken->loc,  EEsProfile, 300, nullptr, "floating-point suffix");
@@ -333,18 +322,10 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
     int ch = 0;
     int ii = 0;
     unsigned long long ival = 0;
-#ifdef AMD_EXTENSIONS
-    bool enableInt16 = pp->parseContext.version >= 450 && pp->parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_int16);
-#endif
-    bool acceptHalf = pp->parseContext.intermediate.getSource() == EShSourceHlsl;
-#ifdef AMD_EXTENSIONS
-    if (pp->parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float))
-        acceptHalf = true;
-#endif
 
     const auto floatingPointChar = [&](int ch) { return ch == '.' || ch == 'e' || ch == 'E' ||
                                                                      ch == 'f' || ch == 'F' ||
-                                                     (acceptHalf && (ch == 'h' || ch == 'H')); };
+                                                                     ch == 'h' || ch == 'H'; };
 
     ppToken->ival = 0;
     ppToken->i64val = 0;
@@ -461,22 +442,22 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                         ungetch();
 
 #ifdef AMD_EXTENSIONS
-                    if (enableInt16) {
-                        int nextCh = getch();
-                        if ((ch == 'u' && nextCh == 's') || (ch == 'U' && nextCh == 'S')) {
-                            if (len < MaxTokenLength)
-                                ppToken->name[len++] = (char)nextCh;
-                            isInt16 = true;
-                        } else
-                            ungetch();
-                    }
+                    nextCh = getch();
+                    if ((nextCh == 's' || nextCh == 'S') &&
+                            pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        if (len < MaxTokenLength)
+                            ppToken->name[len++] = (char)nextCh;
+                        isInt16 = true;
+                    } else
+                        ungetch();
 #endif
                 } else if (ch == 'l' || ch == 'L') {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isInt64 = true;
 #ifdef AMD_EXTENSIONS
-                } else if (enableInt16 && (ch == 's' || ch == 'S')) {
+                } else if ((ch == 's' || ch == 'S') &&
+                           pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isInt16 = true;
@@ -485,17 +466,21 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                     ungetch();
                 ppToken->name[len] = '\0';
 
-                if (isInt64) {
-                    if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
-                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
-                                                         "64-bit hexadecimal literal");
-                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_ARB_gpu_shader_int64,
-                                                         "64-bit hexadecimal literal");
-                    }
+                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                    pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                        "64-bit hexadecimal literal");
+                    pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_ARB_gpu_shader_int64,
+                                                        "64-bit hexadecimal literal");
                     ppToken->i64val = ival;
                     return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;
 #ifdef AMD_EXTENSIONS
                 } else if (isInt16) {
+                    if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                         "16-bit hexadecimal literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_AMD_gpu_shader_int16,
+                                                         "16-bit hexadecimal literal");
+                    }
                     ppToken->ival = (int)ival;
                     return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
 #endif
@@ -559,7 +544,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                     isUnsigned = true;
 
                     int nextCh = getch();
-                    if ((ch == 'u' && nextCh == 'l') || (ch == 'U' && nextCh == 'L')) {
+                    if (nextCh == 'l' || nextCh == 'L') {
                         if (len < MaxTokenLength)
                             ppToken->name[len++] = (char)nextCh;
                         isInt64 = true;
@@ -567,22 +552,22 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                         ungetch();
 
 #ifdef AMD_EXTENSIONS
-                    if (enableInt16) {
-                        int nextCh = getch();
-                        if ((ch == 'u' && nextCh == 's') || (ch == 'U' && nextCh == 'S')) {
-                            if (len < MaxTokenLength)
-                                ppToken->name[len++] = (char)nextCh;
-                            isInt16 = true;
-                        } else
-                            ungetch();
-                    }
+                    nextCh = getch();
+                    if ((nextCh == 's' || nextCh == 'S') && 
+                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        if (len < MaxTokenLength)
+                            ppToken->name[len++] = (char)nextCh;
+                        isInt16 = true;
+                    } else
+                        ungetch();
 #endif
                 } else if (ch == 'l' || ch == 'L') {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isInt64 = true;
 #ifdef AMD_EXTENSIONS
-                } else if (enableInt16 && (ch == 's' || ch == 'S')) {
+                } else if ((ch == 's' || ch == 'S') && 
+                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isInt16 = true;
@@ -597,17 +582,21 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                 if (octalOverflow)
                     pp->parseContext.ppError(ppToken->loc, "octal literal too big", "", "");
 
-                if (isInt64) {
-                    if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
-                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
-                                                         "64-bit octal literal");
-                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_ARB_gpu_shader_int64,
-                                                         "64-bit octal literal");
-                    }
+                if (isInt64 && pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                    pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                        "64-bit octal literal");
+                    pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_ARB_gpu_shader_int64,
+                                                        "64-bit octal literal");
                     ppToken->i64val = ival;
                     return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;
 #ifdef AMD_EXTENSIONS
                 } else if (isInt16) {
+                    if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                         "16-bit octal literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_AMD_gpu_shader_int16,
+                                                         "16-bit octal literal");
+                    }
                     ppToken->ival = (int)ival;
                     return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
 #endif
@@ -646,7 +635,7 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                     isUnsigned = true;
 
                     int nextCh = getch();
-                    if ((ch == 'u' && nextCh == 'l') || (ch == 'U' && nextCh == 'L')) {
+                    if (nextCh == 'l' || nextCh == 'L') {
                         if (len < MaxTokenLength)
                             ppToken->name[len++] = (char)nextCh;
                         isInt64 = true;
@@ -654,22 +643,22 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                         ungetch();
 
 #ifdef AMD_EXTENSIONS
-                    if (enableInt16) {
-                        int nextCh = getch();
-                        if ((ch == 'u' && nextCh == 's') || (ch == 'U' && nextCh == 'S')) {
-                            if (len < MaxTokenLength)
-                                ppToken->name[len++] = (char)nextCh;
-                            isInt16 = true;
-                        } else
-                            ungetch();
-                    }
+                    nextCh = getch();
+                    if ((nextCh == 's' || nextCh == 'S') &&
+                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        if (len < MaxTokenLength)
+                            ppToken->name[len++] = (char)nextCh;
+                        isInt16 = true;
+                    } else
+                        ungetch();
 #endif
                 } else if (ch == 'l' || ch == 'L') {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isInt64 = true;
 #ifdef AMD_EXTENSIONS
-                } else if (enableInt16 && (ch == 's' || ch == 'S')) {
+                } else if ((ch == 's' || ch == 'S') &&
+                                pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
                     if (len < MaxTokenLength)
                         ppToken->name[len++] = (char)ch;
                     isInt16 = true;
@@ -715,6 +704,12 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                     return isUnsigned ? PpAtomConstUint64 : PpAtomConstInt64;
 #ifdef AMD_EXTENSIONS
                 } else if (isInt16) {
+                    if (pp->parseContext.intermediate.getSource() == EShSourceGlsl) {
+                        pp->parseContext.requireProfile(ppToken->loc, ~EEsProfile,
+                                                         "16-bit  literal");
+                        pp->parseContext.profileRequires(ppToken->loc, ~EEsProfile, 0, E_GL_AMD_gpu_shader_int16,
+                                                         "16-bit literal");
+                    }
                     ppToken->ival = (int)ival;
                     return isUnsigned ? PpAtomConstUint16 : PpAtomConstInt16;
 #endif