diff --git a/glslang/Include/Types.h b/glslang/Include/Types.h
index b0f60c1caed3666ac087fc4876cc01f3cf95318f..6b0ce5b7e9f0114530c0fea86cbeac12ef828b96 100644
--- a/glslang/Include/Types.h
+++ b/glslang/Include/Types.h
@@ -153,7 +153,7 @@ inline TTypeList* NewPoolTTypeList()
 }
 
 //
-// TODO: TArraySizes memory: This could be replaced by something smaller.
+// TODO: memory: TArraySizes can be replaced by something smaller.
 // Almost all arrays could be handled by two sizes each fitting
 // in 16 bits, needing a real vector only in the cases where there
 // are more than 3 sizes or a size needing more than 16 bits.
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index e5c77378c436936c42df02bedf4502528c71c095..72acc5ec83d4bab441bad7213e9fbe90715155b8 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -1064,12 +1064,12 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, TString& typeName, int versi
     builtInStrings[EShLangFragment].push_back(s);
     builtInStrings[EShLangVertex].push_back(s);
 
-    // TODO: Functionality: version 420 imaging functions
+    // TODO: 4.2 Functionality: imaging functions
 }
 
 void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
 {
-    // TODO: Functionality: version 420 imaging functions
+    // TODO: 4.2 Functionality: imaging functions
 }
 
 void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
@@ -1462,7 +1462,7 @@ void IdentifyBuiltIns(int version, EProfile profile, EShLanguage language, TSymb
     case EShLangTessControl:
     case EShLangTessEvaluation:
     case EShLangGeometry:
-        // TODO: support these stages
+        // TODO: desktop functionality: support new stages
     
     default:
         assert(false && "Language not supported");
diff --git a/glslang/MachineIndependent/IntermTraverse.cpp b/glslang/MachineIndependent/IntermTraverse.cpp
index 9b21538829c6c9637c04bf3e43c1b783c1045687..6c4adeb5bb535138a9b9799763cdaf5ed816c169 100644
--- a/glslang/MachineIndependent/IntermTraverse.cpp
+++ b/glslang/MachineIndependent/IntermTraverse.cpp
@@ -55,7 +55,7 @@
 //
 void TIntermMethod::traverse(TIntermTraverser* it)
 {
-    // TODO: current tree should always resolve all methods as constants
+    // TODO: functionality: current tree should always resolve all methods as constants
     // 4.3 will leave some length methods as methods
 }
 
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index 5e6bb03f4e0c044a7906ae56e97f29caf5c31efa..fe4d3a9a7fdeac0e2171578e643b726ac013e5f0 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -1268,7 +1268,7 @@ void TIntermTyped::propagatePrecision(TPrecisionQualifier newPrecision)
         }
     }
 
-    // TODO: propagate precision for
+    // TODO: functionality: propagate precision for
     //    comma operator:  just through the last operand
     //    ":?" and ",": where is this triggered?
     //    built-in function calls: how much to propagate to arguments?
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index c4078796425f2dcce698cdce739d49e161b9ef9a..737845387742af4fe416aaf48f65ed1339b3c4e4 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -64,7 +64,7 @@ TParseContext::TParseContext(TSymbolTable& symt, TIntermediate& interm, int v, E
             defaultPrecision[EbtInt] = EpqMedium;
             defaultPrecision[EbtUint] = EpqMedium;
             defaultPrecision[EbtSampler] = EpqLow;
-            // TODO: give error when using float in frag shader without default precision
+            // TODO: semantics: give error when using float in frag shader without default precision
             break;
         default:
             error(1, "INTERNAL ERROR", "unexpected language", "");
@@ -457,7 +457,7 @@ bool TParseContext::reservedErrorCheck(int line, const TString& identifier)
         if (identifier.find("__") != TString::npos) {
             //error(line, "Two consecutive underscores are reserved for future use.", identifier.c_str(), "", "");
             //return true;
-            // TODO: make this an error
+            // TODO: semantics: make this an error
             infoSink.info.message(EPrefixWarning, "Two consecutive underscores are reserved for future use.", line);
             return false;
         }
@@ -1151,9 +1151,9 @@ void TParseContext::setLayoutQualifier(int line, TPublicType& publicType, TStrin
     else
         error(line, "there is no such layout identifier taking an assigned value", id.c_str(), "");
 
-    // TODO: error check: make sure locations are non-overlapping across the whole stage
-    // TODO: error check: if more than one fragment output, all must have a location
-    // TODO: error check: output arrays can only be indexed with a constant (es 300)
+    // TODO: semantics: error check: make sure locations are non-overlapping across the whole stage
+    // TODO: semantics: error check: if more than one fragment output, all must have a location
+    // TODO: semantics: error check: output arrays can only be indexed with a constant (es 300)
 }
 
 // Merge any layout qualifier information from src into dst, leaving everything else in dst alone
@@ -1574,6 +1574,12 @@ void TParseContext::addBlock(int line, TPublicType& publicType, const TString& b
     }
 }
 
+//
+// Take the sequence of statements that has been built up since the last case/default,
+// put it on the list of top-level nodes for the current (inner-most) switch statement,
+// and follow that by the case/default we are on now.  (See switch topology comment on
+// TIntermSwitch.)
+//
 void TParseContext::wrapupSwitchSubsequence(TIntermAggregate* statements, TIntermNode* branchNode)
 {
     TIntermSequence* switchSequence = switchSequenceStack.back();
@@ -1590,6 +1596,10 @@ void TParseContext::wrapupSwitchSubsequence(TIntermAggregate* statements, TInter
         switchSequence->push_back(branchNode);
 }
 
+//
+// Turn the top-level node sequence built up of wrapupSwitchSubsequence9)
+// into a switch node.
+//
 TIntermNode* TParseContext::addSwitch(int line, TIntermTyped* expression, TIntermAggregate* lastStatements)
 {
     profileRequires(line, EEsProfile, 300, 0, "switch statements");
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index fb891729857bf3cb025f1f2a557f7d60b8c07740..8df3352f1c9b22c38550f2c61585bc32692cdef2 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -81,7 +81,7 @@ const int VersionCount = 12;
 // Each has a different set of built-ins, and we want to preserve that from
 // compile to compile.
 //
-// TODO: thread safety: ensure the built-in symbol table levels are reado only.
+// TODO: quality: thread safety: ensure the built-in symbol table levels are reado only.
 TSymbolTable* SharedSymbolTables[VersionCount][EProfileCount][EShLangCount] = {};
 
 TPoolAllocator* PerProcessGPA = 0;
@@ -278,7 +278,7 @@ void ScanVersion(const char* const shaderStrings[], int numStrings, int& version
 
     const char* s = &shaderStrings[0][0];
 
-    // TODO: ES error check: #version must be on first line
+    // TODO: semantics:  ES error check: #version must be on first line
 
     while (ConsumeWhitespaceComment(s))
         ;
@@ -390,7 +390,7 @@ int ShInitialize()
     if (! InitProcess())
         return 0;
 
-    // TODO: Thread safety:
+    // TODO: Quality: Thread safety:
     // This method should be called once per process. If it's called by multiple threads, then 
     // we need to have thread synchronization code around the initialization of per process
     // global pool allocator
diff --git a/glslang/MachineIndependent/glslang.l b/glslang/MachineIndependent/glslang.l
index bcb579bd94ca73bc664659b15315b567860308ef..862bad540d91daa02ed78018f79f7581deae1f87 100644
--- a/glslang/MachineIndependent/glslang.l
+++ b/glslang/MachineIndependent/glslang.l
@@ -59,9 +59,6 @@ U           [uU]
 F           [fF]
 LF          [lL][fF]
 
-/* TODO: double literals, which will likely require pre-processor rework */
-/* TODO: unsigned int literals, which will likely require pre-processor rework */
-
 %option nounput
 %{
 #include <stdio.h>
@@ -107,10 +104,10 @@ int yy_input(char* buf, int max_size);
 %%
 <*>"//"[^\n]*"\n"     { /* CPP should have taken care of this */ };
 
-"attribute"    {  pyylval->lex.line = yylineno; return(ATTRIBUTE); }  // TODO ES 30 reserved
+"attribute"    {  pyylval->lex.line = yylineno; return(ATTRIBUTE); }  // TODO: semantics: ES 30 reserved
 "const"        {  pyylval->lex.line = yylineno; return(CONST); }
 "uniform"      {  pyylval->lex.line = yylineno; return(UNIFORM); }
-"varying"      {  pyylval->lex.line = yylineno; return(VARYING); }    // TODO ES 30 reserved
+"varying"      {  pyylval->lex.line = yylineno; return(VARYING); }    // TODO: semantics: ES 30 reserved
 "buffer"       {  pyylval->lex.line = yylineno; return(BUFFER); }
 "shared"       {  pyylval->lex.line = yylineno; return(SHARED); }
 
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index 4a7f950e00ae23cf5286c46589f9156c5975ecdf..d4e85c7b583e88c5a6bf83fb5725fa5d33c26912 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -378,7 +378,7 @@ postfix_expression
             // we later see the function calling syntax.  Save away the name for now.
             //
 
-            // TODO: if next token is not "(", then this is an error
+            // TODO: semantics: if next token is not "(", then this is an error
 
             if (*$3.string == "length") {
                 parseContext.profileRequires($3.line, ENoProfile, 120, "GL_3DL_array_objects", ".length");
@@ -505,7 +505,7 @@ function_call
         TFunction* fnCall = $1.function;
         TOperator op = fnCall->getBuiltInOp();
         if (op == EOpArrayLength) {
-            // TODO: check for no arguments to .length()
+            // TODO: semantics: check for no arguments to .length()
             int length;
             if ($1.intermNode->getAsTyped() == 0 || ! $1.intermNode->getAsTyped()->getType().isArray() || $1.intermNode->getAsTyped()->getType().getArraySize() == 0) {
                 parseContext.error($1.line, "", fnCall->getName().c_str(), "array must be declared with a size before using this method");
@@ -596,7 +596,7 @@ function_call
     }
     ;
 
-// TODO: can we eliminate function_call_or_method and function_call_generic?
+// TODO: clean up: can we eliminate function_call_or_method and function_call_generic?
 function_call_or_method
     : function_call_generic {
         $$ = $1;
@@ -1182,7 +1182,7 @@ constant_expression
 declaration
     : function_prototype SEMICOLON {
         $$ = 0;
-        // TODO: subroutines: make the identifier a user type for this signature
+        // TODO: 4.0 functionality: subroutines: make the identifier a user type for this signature
     }
     | init_declarator_list SEMICOLON {
         if ($1.intermAggregate)
@@ -1795,7 +1795,7 @@ storage_qualifier
         if (parseContext.globalErrorCheck($1.line, parseContext.symbolTable.atGlobalLevel(), "buffer"))
             parseContext.recover();
         $$.init($1.line);
-        $$.qualifier.storage = EvqUniform; // TODO: functionality: implement BUFFER
+        $$.qualifier.storage = EvqUniform; // TODO: 4.0 functionality: implement BUFFER
     }
     | SHARED {
         $$.init($1.line);
@@ -1832,7 +1832,7 @@ storage_qualifier
             parseContext.recover();
         $$.init($1.line);
         $$.qualifier.storage = EvqUniform;
-        // TODO: subroutine semantics
+        // TODO: 4.0 semantics: subroutines
         // 1) make sure each identifier is a type declared earlier with SUBROUTINE
         // 2) save all of the identifiers for future comparison with the declared function
     }
@@ -1840,10 +1840,9 @@ storage_qualifier
 
 type_name_list
     : TYPE_NAME {
-        // TODO: add subroutine type to list
+        // TODO: 4.0 functionality: subroutine type to list
     }
     | type_name_list COMMA TYPE_NAME {
-        // TODO: add subroutine type to list
     }
     ;
 
@@ -2129,7 +2128,7 @@ type_specifier_nonarray
         $$.setMatrix(4, 4);
     }
     | ATOMIC_UINT {
-        // TODO: add type
+        // TODO: 4.2 functionality: add type
         $$.init($1.line, parseContext.symbolTable.atGlobalLevel());
         $$.basicType = EbtInt;
     }
@@ -2678,7 +2677,7 @@ initializer_list
         $$ = $1;
     }
     | initializer_list COMMA initializer {
-        // TODO: implement the list
+        // TODO: 4.2 functionality: implement the initializer list
         $$ = $3;
     }
     ;