diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index ec0d95e..79b1a18 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -99,7 +99,7 @@
     spv::Id createUnaryOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, spv::Id operand, bool isFloat);
     spv::Id createConversion(glslang::TOperator op, spv::Decoration precision, spv::Id destTypeId, spv::Id operand);
     spv::Id makeSmearedConstant(spv::Id constant, int vectorSize);
-    spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, bool isUnsigned);
+    spv::Id createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands);
     spv::Id createNoArgOperation(glslang::TOperator op);
     spv::Id getSymbolId(const glslang::TIntermSymbol* node);
     void addDecoration(spv::Id id, spv::Decoration dec);
@@ -1029,11 +1029,8 @@
         result = createUnaryOperation(node->getOp(), precision, convertGlslangToSpvType(node->getType()), operands.front(), node->getType().getBasicType() == glslang::EbtFloat || node->getType().getBasicType() == glslang::EbtDouble);
         break;
     default:
-        {
-            const glslang::TType& type = glslangOperands.front()->getAsTyped()->getType();
-            result = createMiscOperation(node->getOp(), precision, convertGlslangToSpvType(node->getType()), operands, type.getBasicType() == glslang::EbtUint);
-            break;
-        }
+        result = createMiscOperation(node->getOp(), precision, convertGlslangToSpvType(node->getType()), operands);
+        break;
     }
 
     if (noReturnValue)
@@ -1271,7 +1268,7 @@
 // Do full recursive conversion of an arbitrary glslang type to a SPIR-V Id.
 spv::Id TGlslangToSpvTraverser::convertGlslangToSpvType(const glslang::TType& type)
 {
-    spv::Id spvType;
+    spv::Id spvType = 0;
 
     switch (type.getBasicType()) {
     case glslang::EbtVoid:
@@ -2142,8 +2139,8 @@
 spv::Id TGlslangToSpvTraverser::createConversion(glslang::TOperator op, spv::Decoration precision, spv::Id destType, spv::Id operand)
 {
     spv::Op convOp = spv::OpNop;
-    spv::Id zero;
-    spv::Id one;
+    spv::Id zero = 0;
+    spv::Id one = 0;
 
     int vectorSize = builder.isVectorType(destType) ? builder.getNumTypeComponents(destType) : 0;
 
@@ -2246,7 +2243,7 @@
     return builder.makeCompositeConstant(vectorTypeId, components);
 }
 
-spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands, bool isUnsigned)
+spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::Decoration precision, spv::Id typeId, std::vector<spv::Id>& operands)
 {
     spv::Op opCode = spv::OpNop;
     int libCall = -1;
@@ -2502,7 +2499,7 @@
     } else {
         // we have a non-aggregate (scalar) constant
         bool zero = nextConst >= consts.size();
-        spv::Id scalar;
+        spv::Id scalar = 0;
         switch (glslangType.getBasicType()) {
         case glslang::EbtInt:
             scalar = builder.makeIntConstant(zero ? 0 : consts[nextConst].getIConst());
diff --git a/SPIRV/SPVRemapper.h b/SPIRV/SPVRemapper.h
index 73b09ec..5af95f9 100644
--- a/SPIRV/SPVRemapper.h
+++ b/SPIRV/SPVRemapper.h
@@ -79,9 +79,9 @@
 class spirvbin_t : public spirvbin_base_t
 {
 public:
-    spirvbin_t(int verbose = 0) { }
+    spirvbin_t(int /*verbose = 0*/) { }
 
-    void remap(std::vector<unsigned int>& spv, unsigned int opts = 0)
+    void remap(std::vector<unsigned int>& /*spv*/, unsigned int /*opts = 0*/)
     {
         printf("Tool not compiled for C++11, which is required for SPIR-V remapping.\n");
     }
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index e46c02c..abfc832 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -117,7 +117,7 @@
     Instruction* type;
     for (int t = 0; t < (int)groupedTypes[OpTypePointer].size(); ++t) {
         type = groupedTypes[OpTypePointer][t];
-        if (type->getImmediateOperand(0) == storageClass &&
+        if (type->getImmediateOperand(0) == (unsigned)storageClass &&
             type->getIdOperand(1) == pointee)
             return type->getResultId();
     }
@@ -139,8 +139,8 @@
     Instruction* type;
     for (int t = 0; t < (int)groupedTypes[OpTypeInt].size(); ++t) {
         type = groupedTypes[OpTypeInt][t];
-        if (type->getImmediateOperand(0) == width &&
-            type->getImmediateOperand(1) == (hasSign ? 1 : 0))
+        if (type->getImmediateOperand(0) == (unsigned)width &&
+            type->getImmediateOperand(1) == (hasSign ? 1u : 0u))
             return type->getResultId();
     }
 
@@ -161,7 +161,7 @@
     Instruction* type;
     for (int t = 0; t < (int)groupedTypes[OpTypeFloat].size(); ++t) {
         type = groupedTypes[OpTypeFloat][t];
-        if (type->getImmediateOperand(0) == width)
+        if (type->getImmediateOperand(0) == (unsigned)width)
             return type->getResultId();
     }
 
@@ -196,7 +196,7 @@
     for (int t = 0; t < (int)groupedTypes[OpTypeVector].size(); ++t) {
         type = groupedTypes[OpTypeVector][t];
         if (type->getIdOperand(0) == component &&
-            type->getImmediateOperand(1) == size)
+            type->getImmediateOperand(1) == (unsigned)size)
             return type->getResultId();
     }
 
@@ -222,7 +222,7 @@
     for (int t = 0; t < (int)groupedTypes[OpTypeMatrix].size(); ++t) {
         type = groupedTypes[OpTypeMatrix][t];
         if (type->getIdOperand(0) == column &&
-            type->getImmediateOperand(1) == cols)
+            type->getImmediateOperand(1) == (unsigned)cols)
             return type->getResultId();
     }
 
@@ -268,7 +268,7 @@
     Instruction* type;
     for (int t = 0; t < (int)groupedTypes[OpTypeFunction].size(); ++t) {
         type = groupedTypes[OpTypeFunction][t];
-        if (type->getIdOperand(0) != returnType || paramTypes.size() != type->getNumOperands() - 1)
+        if (type->getIdOperand(0) != returnType || (int)paramTypes.size() != type->getNumOperands() - 1)
             continue;
         bool mismatch = false;
         for (int p = 0; p < (int)paramTypes.size(); ++p) {
@@ -547,13 +547,13 @@
 
 Id Builder::findCompositeConstant(Op typeClass, std::vector<Id>& comps) const
 {
-    Instruction* constant;
+    Instruction* constant = 0;
     bool found = false;
     for (int i = 0; i < (int)groupedConstants[typeClass].size(); ++i) {
         constant = groupedConstants[typeClass][i];
 
         // same shape?
-        if (constant->getNumOperands() != comps.size())
+        if (constant->getNumOperands() != (int)comps.size())
             continue;
 
         // same contents?
@@ -1049,7 +1049,7 @@
 }
 
 // Comments in header
-Id Builder::smearScalar(Decoration precision, Id scalar, Id vectorType)
+Id Builder::smearScalar(Decoration /*precision*/, Id scalar, Id vectorType)
 {
     assert(getNumComponents(scalar) == 1);
 
@@ -1066,7 +1066,7 @@
 }
 
 // Comments in header
-Id Builder::createBuiltinCall(Decoration precision, Id resultType, Id builtins, int entryPoint, std::vector<Id>& args)
+Id Builder::createBuiltinCall(Decoration /*precision*/, Id resultType, Id builtins, int entryPoint, std::vector<Id>& args)
 {
     Instruction* inst = new Instruction(getUniqueId(), resultType, OpExtInst);
     inst->addIdOperand(builtins);
@@ -1259,8 +1259,6 @@
 // Comments in header
 Id Builder::createCompare(Decoration precision, Id value1, Id value2, bool equal)
 {
-    Instruction* compare = 0;
-    spv::Op binOp = spv::OpNop;
     Id boolType = makeBoolType();
     Id valueType = getTypeId(value1);
 
@@ -1461,7 +1459,7 @@
 // Vector or scalar constructor
 Id Builder::createConstructor(Decoration precision, const std::vector<Id>& sources, Id resultTypeId)
 {
-    Id result;
+    Id result = 0;
     unsigned int numTargetComponents = getNumTypeComponents(resultTypeId);
     unsigned int targetComponent = 0;
 
@@ -1701,7 +1699,7 @@
 }
 
 // Comments in header
-void Builder::endSwitch(std::vector<Block*>& segmentBlock)
+void Builder::endSwitch(std::vector<Block*>& /*segmentBlock*/)
 {
     // Close out previous segment by jumping, if necessary, to next segment
     if (! buildPoint->isTerminated())
@@ -1840,7 +1838,7 @@
 }
 
 // Comments in header
-Id Builder::accessChainLoad(Decoration precision)
+Id Builder::accessChainLoad(Decoration /*precision*/)
 {
     Id id;
 
@@ -1991,7 +1989,7 @@
 // Utility method for creating a new block and setting the insert point to
 // be in it. This is useful for flow-control operations that need a "dummy"
 // block proceeding them (e.g. instructions after a discard, etc).
-void Builder::createAndSetNoPredecessorBlock(const char* name)
+void Builder::createAndSetNoPredecessorBlock(const char* /*name*/)
 {
     Block* block = new Block(getUniqueId(), buildPoint->getParent());
     block->setUnreachable();
diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h
index b4417df..b38d4a5 100644
--- a/SPIRV/SpvBuilder.h
+++ b/SPIRV/SpvBuilder.h
@@ -101,7 +101,7 @@
     Id makeMatrixType(Id component, int cols, int rows);
     Id makeArrayType(Id element, unsigned size);
     Id makeFunctionType(Id returnType, std::vector<Id>& paramTypes);
-    enum samplerContent {
+    enum samplerContent : unsigned {
         samplerContentTexture,
         samplerContentImage,
         samplerContentTextureFilter
@@ -250,7 +250,7 @@
 
     // If the value passed in is an instruction and the precision is not EMpNone,
     // it gets tagged with the requested precision.
-    void setPrecision(Id value, Decoration precision)
+    void setPrecision(Id /* value */, Decoration /* precision */)
     {
         // TODO
     }
@@ -318,6 +318,9 @@
         void makeEndIf();
 
     private:
+        If(const If&);
+        If& operator=(If&);
+
         Builder& builder;
         Id condition;
         Function* function;
diff --git a/SPIRV/disassemble.cpp b/SPIRV/disassemble.cpp
index 3daff74..7a9b10d 100644
--- a/SPIRV/disassemble.cpp
+++ b/SPIRV/disassemble.cpp
@@ -70,6 +70,9 @@
     void processInstructions();
 
 protected:
+    SpirvStream(SpirvStream&);
+    SpirvStream& operator=(SpirvStream&);
+
     Op getOpCode(int id) const { return idInstruction[id] ? (Op)(stream[idInstruction[id]] & OpCodeMask) : OpNop; }
 
     // Output methods
@@ -278,7 +281,7 @@
     out << "\"";
 }
 
-void SpirvStream::disassembleInstruction(Id resultId, Id typeId, Op opCode, int numOperands)
+void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, int numOperands)
 {
     // Process the opcode
 
diff --git a/SPIRV/spvIR.h b/SPIRV/spvIR.h
index 718b3d5..ec75824 100644
--- a/SPIRV/spvIR.h
+++ b/SPIRV/spvIR.h
@@ -210,6 +210,7 @@
 
 protected:
     Block(const Block&);
+    Block& operator=(Block&);
 
     // To enforce keeping parent and ownership in sync:
     friend Function;
@@ -244,7 +245,7 @@
     Id getParamId(int p) { return parameterInstructions[p]->getResultId(); }
 
     void addBlock(Block* block) { blocks.push_back(block); }
-    void popBlock(Block* block) { assert(blocks.back() == block); blocks.pop_back(); }
+    void popBlock(Block*) { blocks.pop_back(); }
 
     Module& getParent() const { return parent; }
     Block* getEntryBlock() const { return blocks.front(); }
@@ -269,6 +270,8 @@
 
 protected:
     Function(const Function&);
+    Function& operator=(Function&);
+
     Module& parent;
     Instruction functionInstruction;
     std::vector<Instruction*> parameterInstructions;
diff --git a/StandAlone/StandAlone.cpp b/StandAlone/StandAlone.cpp
index 4f38566..af6f8dc 100644
--- a/StandAlone/StandAlone.cpp
+++ b/StandAlone/StandAlone.cpp
@@ -938,7 +938,7 @@
         printf("Error allocating memory\n");
         return 0;
     }
-    if (fread(fdata,1,count, in)!=count) {
+    if ((int)fread(fdata,1,count, in) != count) {
             printf("Error reading input file: %s\n", fileName);
             return 0;
     }
diff --git a/glslang/GenericCodeGen/CodeGen.cpp b/glslang/GenericCodeGen/CodeGen.cpp
index 7628c49..dc78342 100644
--- a/glslang/GenericCodeGen/CodeGen.cpp
+++ b/glslang/GenericCodeGen/CodeGen.cpp
@@ -68,7 +68,7 @@
 //
 //  Generate code from the given parse tree
 //
-bool TGenericCompiler::compile(TIntermNode *root, int version, EProfile profile)
+bool TGenericCompiler::compile(TIntermNode* /*root*/, int /*version*/, EProfile /*profile*/)
 {
     haveValidObjectCode = true;
 
diff --git a/glslang/GenericCodeGen/Link.cpp b/glslang/GenericCodeGen/Link.cpp
index 60762d8..8160999 100644
--- a/glslang/GenericCodeGen/Link.cpp
+++ b/glslang/GenericCodeGen/Link.cpp
@@ -46,7 +46,7 @@
 public:
     TGenericLinker(EShExecutable e, int dOptions) : TLinker(e, infoSink), debugOptions(dOptions) { }
     bool link(TCompilerList&, TUniformMap*) { return true; }
-	void getAttributeBindings(ShBindingTable const **t) const { }
+	void getAttributeBindings(ShBindingTable const **) const { }
     TInfoSink infoSink;
     int debugOptions;
 };
@@ -57,7 +57,7 @@
 class TUniformLinkedMap : public TUniformMap {
 public:
     TUniformLinkedMap() { }
-    virtual int getLocation(const char* name) { return 0; }
+    virtual int getLocation(const char*) { return 0; }
 };
 
 TShHandleBase* ConstructLinker(EShExecutable executable, int debugOptions)
diff --git a/glslang/Include/ConstantUnion.h b/glslang/Include/ConstantUnion.h
index 9317504..62b489d 100644
--- a/glslang/Include/ConstantUnion.h
+++ b/glslang/Include/ConstantUnion.h
@@ -185,8 +185,6 @@
             assert(false && "Default missing");
             return false;
         }
-
-        return false;
     }
 
     bool operator<(const TConstUnion& constant) const
@@ -212,8 +210,6 @@
             assert(false && "Default missing");
             return false;
         }
-
-        return false;
     }
 
     TConstUnion operator+(const TConstUnion& constant) const
diff --git a/glslang/Include/PoolAlloc.h b/glslang/Include/PoolAlloc.h
index 59ddc41..de41053 100644
--- a/glslang/Include/PoolAlloc.h
+++ b/glslang/Include/PoolAlloc.h
@@ -214,11 +214,13 @@
     typedef std::vector<tAllocState> tAllocStack;
 
     // Track allocations if and only if we're using guard blocks
+#ifndef GUARD_BLOCKS
+    void* initializeAllocation(tHeader*, unsigned char* memory, size_t) {
+#else
     void* initializeAllocation(tHeader* block, unsigned char* memory, size_t numBytes) {
-#       ifdef GUARD_BLOCKS
         new(memory) TAllocation(numBytes, memory, block->lastAllocation);
         block->lastAllocation = reinterpret_cast<TAllocation*>(memory);
-#       endif
+#endif
 
         // This is optimized entirely away if GUARD_BLOCKS is not defined.
         return TAllocation::offsetAllocation(memory);
@@ -314,7 +316,7 @@
     TPoolAllocator& getAllocator() const { return allocator; }
 
 protected:
-    pool_allocator& operator=(const pool_allocator& rhs) { return *this; }
+    pool_allocator& operator=(const pool_allocator&) { return *this; }
     TPoolAllocator& allocator;
 };
 
diff --git a/glslang/Include/ShHandle.h b/glslang/Include/ShHandle.h
index 5e61a98..68b56cc 100644
--- a/glslang/Include/ShHandle.h
+++ b/glslang/Include/ShHandle.h
@@ -98,6 +98,8 @@
     
     TInfoSink& infoSink;
 protected:
+    TCompiler& operator=(TCompiler&);
+
     EShLanguage language;
     bool haveValidObjectCode;
 };
@@ -137,6 +139,7 @@
     virtual TInfoSink& getInfoSink() { return infoSink; }
     TInfoSink& infoSink;
 protected:
+    TLinker& operator=(TLinker&);
     EShExecutable executable;
     bool haveReturnableObjectCode;  // true when objectCode is acceptable to send to driver
 
diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h
index 0647a76..46d5085 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -694,15 +694,15 @@
             maxDepth(0) { }
     virtual ~TIntermTraverser() { }
 
-    virtual void visitSymbol(TIntermSymbol*)                     { }
-    virtual void visitConstantUnion(TIntermConstantUnion*)       { }
-    virtual bool visitBinary(TVisit visit, TIntermBinary*)       { return true; }
-    virtual bool visitUnary(TVisit visit, TIntermUnary*)         { return true; }
-    virtual bool visitSelection(TVisit visit, TIntermSelection*) { return true; }
-    virtual bool visitAggregate(TVisit visit, TIntermAggregate*) { return true; }
-    virtual bool visitLoop(TVisit visit, TIntermLoop*)           { return true; }
-    virtual bool visitBranch(TVisit visit, TIntermBranch*)       { return true; }
-    virtual bool visitSwitch(TVisit, TIntermSwitch* node)        { return true; }
+    virtual void visitSymbol(TIntermSymbol*)               { }
+    virtual void visitConstantUnion(TIntermConstantUnion*) { }
+    virtual bool visitBinary(TVisit, TIntermBinary*)       { return true; }
+    virtual bool visitUnary(TVisit, TIntermUnary*)         { return true; }
+    virtual bool visitSelection(TVisit, TIntermSelection*) { return true; }
+    virtual bool visitAggregate(TVisit, TIntermAggregate*) { return true; }
+    virtual bool visitLoop(TVisit, TIntermLoop*)           { return true; }
+    virtual bool visitBranch(TVisit, TIntermBranch*)       { return true; }
+    virtual bool visitSwitch(TVisit, TIntermSwitch*)       { return true; }
 
     int getMaxDepth() const { return maxDepth; }
 
@@ -730,6 +730,8 @@
     const bool rightToLeft;
 
 protected:
+    TIntermTraverser& operator=(TIntermTraverser&);
+
     int depth;
     int maxDepth;
 
diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp
index 728245a..6590ee3 100644
--- a/glslang/MachineIndependent/Constant.cpp
+++ b/glslang/MachineIndependent/Constant.cpp
@@ -646,10 +646,10 @@
 
             // some arguments are scalars instead of matching vectors; simulate a smear
             int arg0comp = std::min(comp, children[0]->getAsTyped()->getType().getVectorSize() - 1);
-            int arg1comp;
+            int arg1comp = 0;
             if (children.size() > 1)
                 arg1comp = std::min(comp, children[1]->getAsTyped()->getType().getVectorSize() - 1);
-            int arg2comp;
+            int arg2comp = 0;
             if (children.size() > 2)
                 arg2comp = std::min(comp, children[2]->getAsTyped()->getType().getVectorSize() - 1);
 
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index 2735a9f..10ed73c 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -1951,7 +1951,7 @@
 //
 // Add all the texture lookup functions for the given type.
 //
-void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
+void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int /*version*/, EProfile /*profile*/)
 {
     //
     // texturing
diff --git a/glslang/MachineIndependent/IntermTraverse.cpp b/glslang/MachineIndependent/IntermTraverse.cpp
index 3bca44d..b0ac4c7 100644
--- a/glslang/MachineIndependent/IntermTraverse.cpp
+++ b/glslang/MachineIndependent/IntermTraverse.cpp
@@ -56,7 +56,7 @@
 //
 // Traversal functions for terminals are straighforward....
 //
-void TIntermMethod::traverse(TIntermTraverser* it)
+void TIntermMethod::traverse(TIntermTraverser*)
 {
     // Tree should always resolve all methods as a non-method.
 }
diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp
index e37830d..43836f2 100644
--- a/glslang/MachineIndependent/Intermediate.cpp
+++ b/glslang/MachineIndependent/Intermediate.cpp
@@ -891,7 +891,7 @@
 // This is to be executed after the final root is put on top by the parsing
 // process.
 //
-bool TIntermediate::postProcess(TIntermNode* root, EShLanguage language)
+bool TIntermediate::postProcess(TIntermNode* root, EShLanguage /*language*/)
 {
     if (root == 0)
         return true;
@@ -968,7 +968,7 @@
 // Add a caller->callee relationship to the call graph.
 // Assumes the strings are unique per signature.
 //
-void TIntermediate::addToCallGraph(TInfoSink& infoSink, const TString& caller, const TString& callee)
+void TIntermediate::addToCallGraph(TInfoSink& /*infoSink*/, const TString& caller, const TString& callee)
 {
     // Duplicates are okay, but faster to not keep them, and they come grouped by caller,
     // as long as new ones are push on the same end we check on for duplicates
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index a9f9e6c..d5d4135 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -536,7 +536,7 @@
 }
 
 // for ES 2.0 (version 100) limitations for almost all index operations except vertex-shader uniforms
-void TParseContext::handleIndexLimits(TSourceLoc loc, TIntermTyped* base, TIntermTyped* index)
+void TParseContext::handleIndexLimits(TSourceLoc /*loc*/, TIntermTyped* base, TIntermTyped* index)
 {
     if ((! limits.generalSamplerIndexing && base->getBasicType() == EbtSampler) ||
         (! limits.generalUniformIndexing && base->getQualifier().isUniformOrBuffer() && language != EShLangVertex) ||
@@ -611,7 +611,7 @@
 // Handle a dereference of a geometry shader input array or tessellation control output array.
 // See ioArraySymbolResizeList comment in ParseHelper.h.
 //
-void TParseContext::handleIoResizeArrayAccess(TSourceLoc loc, TIntermTyped* base)
+void TParseContext::handleIoResizeArrayAccess(TSourceLoc /*loc*/, TIntermTyped* base)
 {
     TIntermSymbol* symbolNode = base->getAsSymbolNode();
     assert(symbolNode);
@@ -645,6 +645,8 @@
         feature = TQualifier::getGeometryString(intermediate.getInputPrimitive());
     else if (language == EShLangTessControl)
         feature = "vertices";
+    else
+        feature = "unknown";
 
     if (tailOnly) {
         checkIoArrayConsistency(loc, requiredSize, feature, ioArraySymbolResizeList.back()->getWritableType(), ioArraySymbolResizeList.back()->getName());
@@ -1408,7 +1410,7 @@
     if (type.isStruct())
         return EOpConstructStruct;
 
-    TOperator op;
+    TOperator op = EOpNull;
     switch (type.getBasicType()) {
     case EbtFloat:
         if (type.isMatrix()) {
@@ -1515,7 +1517,6 @@
         }
         break;
     default:
-        op = EOpNull;
         break;
     }
 
@@ -1930,7 +1931,7 @@
         return true;
     }
 
-    if (op == EOpConstructStruct && ! type.isArray() && type.getStruct()->size() != function.getParamCount()) {
+    if (op == EOpConstructStruct && ! type.isArray() && (int)type.getStruct()->size() != function.getParamCount()) {
         error(loc, "Number of constructor parameters does not match the number of structure fields", "constructor", "");
         return true;
     }
@@ -2228,7 +2229,7 @@
         dst.precision = src.precision;
 
     // Layout qualifiers
-    mergeObjectLayoutQualifiers(loc, dst, src, false);
+    mergeObjectLayoutQualifiers(dst, src, false);
 
     // individual qualifiers
     bool repeated = false;
@@ -2422,7 +2423,7 @@
     }
 }
 
-void TParseContext::structArrayCheck(TSourceLoc loc, TType* type)
+void TParseContext::structArrayCheck(TSourceLoc /*loc*/, TType* type)
 {
     const TTypeList& structure = *type->getStruct();
     for (int m = 0; m < (int)structure.size(); ++m) {
@@ -2545,7 +2546,7 @@
     // as that type will be shared through shallow copies for future references.
     TSymbol* symbol = 0;
     int blockIndex = -1;
-    const TString* lookupName;
+    const TString* lookupName = 0;
     if (node->getAsSymbolNode())
         lookupName = &node->getAsSymbolNode()->getName();
     else if (node->getAsBinaryNode()) {
@@ -2782,7 +2783,7 @@
         // look for match
         bool found = false;
         TTypeList::const_iterator newMember;
-        TSourceLoc memberLoc;
+        TSourceLoc memberLoc = {};
         for (newMember = newTypeList.begin(); newMember != newTypeList.end(); ++newMember) {
             if (member->type->getFieldName() == newMember->type->getFieldName()) {
                 found = true;
@@ -2935,7 +2936,7 @@
         error(loc, "can't use with samplers or structs containing samplers", op, "");
 }
 
-void TParseContext::structTypeCheck(TSourceLoc loc, TPublicType& publicType)
+void TParseContext::structTypeCheck(TSourceLoc /*loc*/, TPublicType& publicType)
 {
     const TTypeList& typeList = *publicType.userDef->getStruct();
 
@@ -2982,7 +2983,7 @@
     bool badInit = false;
     if (! init || ! init->getAsAggregate() || init->getAsAggregate()->getSequence().size() != 1)
         badInit = true;
-    TIntermBinary* binaryInit;
+    TIntermBinary* binaryInit = 0;
     if (! badInit) {
         // get the declaration assignment
         binaryInit = init->getAsAggregate()->getSequence()[0]->getAsBinaryNode();
@@ -3457,7 +3458,7 @@
 // overrides the other (e.g., row_major vs. column_major); only the last 
 // occurrence has any effect."    
 //
-void TParseContext::mergeObjectLayoutQualifiers(TSourceLoc loc, TQualifier& dst, const TQualifier& src, bool inheritOnly)
+void TParseContext::mergeObjectLayoutQualifiers(TQualifier& dst, const TQualifier& src, bool inheritOnly)
 {
     if (src.hasMatrix())
         dst.layoutMatrix = src.layoutMatrix;
@@ -3853,8 +3854,6 @@
 // Function finding algorithm for ES and desktop 110.
 const TFunction* TParseContext::findFunctionExact(TSourceLoc loc, const TFunction& call, bool& builtIn)
 {
-    const TFunction* function = 0;
-
     TSymbol* symbol = symbolTable.find(call.getMangledName(), &builtIn);
     if (symbol == 0) {
         error(loc, "no matching overloaded function found", call.getName().c_str(), "");
@@ -3886,7 +3885,6 @@
     TVector<TFunction*> candidateList;
     symbolTable.findFunctionNameList(call.getMangledName(), candidateList, builtIn);
 
-    int numPossibleMatches = 0;
     for (TVector<TFunction*>::const_iterator it = candidateList.begin(); it != candidateList.end(); ++it) {
         const TFunction& function = *(*it);
 
@@ -4034,7 +4032,7 @@
             error(loc, "initializer requires a variable, not a member", identifier.c_str(), "");
             return 0;
         }
-        initNode = executeInitializer(loc, identifier, initializer, variable);
+        initNode = executeInitializer(loc, initializer, variable);
     }
 
     // look for errors in layout qualifier use
@@ -4068,7 +4066,6 @@
 TVariable* TParseContext::makeInternalVariable(const char* name, const TType& type) const
 {
     TString* nameString = new TString(name);
-    TSourceLoc loc = {0, 0};
     TVariable* variable = new TVariable(nameString, type);
     symbolTable.makeInternalVariable(*variable);
 
@@ -4103,8 +4100,7 @@
 // Returning 0 just means there is no code to execute to handle the
 // initializer, which will, for example, be the case for constant initializers.
 //
-TIntermNode* TParseContext::executeInitializer(TSourceLoc loc, TString& identifier,
-                                               TIntermTyped* initializer, TVariable* variable)
+TIntermNode* TParseContext::executeInitializer(TSourceLoc loc, TIntermTyped* initializer, TVariable* variable)
 {
     //
     // Identifier must be of type constant, a global, or a temporary, and
@@ -4241,7 +4237,7 @@
                 return 0;
         }
     } else if (type.isMatrix()) {
-        if (type.getMatrixCols() != initList->getSequence().size()) {
+        if (type.getMatrixCols() != (int)initList->getSequence().size()) {
             error(loc, "wrong number of matrix columns:", "initializer list", type.getCompleteString().c_str());
             return 0;
         }
@@ -4252,7 +4248,7 @@
                 return 0;
         }
     } else if (type.isVector()) {
-        if (type.getVectorSize() != initList->getSequence().size()) {
+        if (type.getVectorSize() != (int)initList->getSequence().size()) {
             error(loc, "wrong vector size (or rows in a matrix column):", "initializer list", type.getCompleteString().c_str());
             return 0;
         }
@@ -4546,7 +4542,7 @@
 
     // fix and check for member layout qualifiers
 
-    mergeObjectLayoutQualifiers(loc, defaultQualification, currentBlockQualifier, true);
+    mergeObjectLayoutQualifiers(defaultQualification, currentBlockQualifier, true);
 
     // "The offset qualifier can only be used on block members of blocks declared with std140 or std430 layouts."
     // "The align qualifier can only be used on blocks or block members, and only for blocks declared with std140 or std430 layouts."
@@ -4605,14 +4601,14 @@
 
     // Process the members
     fixBlockLocations(loc, currentBlockQualifier, typeList, memberWithLocation, memberWithoutLocation);
-    fixBlockXfbOffsets(loc, currentBlockQualifier, typeList);
-    fixBlockUniformOffsets(loc, currentBlockQualifier, typeList);
+    fixBlockXfbOffsets(currentBlockQualifier, typeList);
+    fixBlockUniformOffsets(currentBlockQualifier, typeList);
     for (unsigned int member = 0; member < typeList.size(); ++member)
         layoutTypeCheck(typeList[member].loc, *typeList[member].type);
 
     // reverse merge, so that currentBlockQualifier now has all layout information
     // (can't use defaultQualification directly, it's missing other non-layout-default-class qualifiers)
-    mergeObjectLayoutQualifiers(loc, currentBlockQualifier, defaultQualification, true);
+    mergeObjectLayoutQualifiers(currentBlockQualifier, defaultQualification, true);
 
     //
     // Build and add the interface block as a new type named 'blockName'
@@ -4696,7 +4692,7 @@
     else {
         if (memberWithLocation) {
             // remove any block-level location and make it per *every* member
-            int nextLocation;  // by the rule above, initial value is not relevant
+            int nextLocation = 0;  // by the rule above, initial value is not relevant
             if (qualifier.hasAnyLocation()) {
                 nextLocation = qualifier.layoutLocation;
                 qualifier.layoutLocation = TQualifier::layoutLocationEnd;
@@ -4723,7 +4719,7 @@
     }
 }
 
-void TParseContext::fixBlockXfbOffsets(TSourceLoc loc, TQualifier& qualifier, TTypeList& typeList)
+void TParseContext::fixBlockXfbOffsets(TQualifier& qualifier, TTypeList& typeList)
 {
     // "If a block is qualified with xfb_offset, all its 
     // members are assigned transform feedback buffer offsets. If a block is not qualified with xfb_offset, any 
@@ -4760,7 +4756,7 @@
 // Also, compute and save the total size of the block. For the block's size, arrayness 
 // is not taken into account, as each element is backed by a separate buffer.
 //
-void TParseContext::fixBlockUniformOffsets(TSourceLoc loc, TQualifier& qualifier, TTypeList& typeList)
+void TParseContext::fixBlockUniformOffsets(TQualifier& qualifier, TTypeList& typeList)
 {
     if (! qualifier.isUniformOrBuffer())
         return;
@@ -4950,7 +4946,7 @@
                 if (! intermediate.setLocalSize(i, publicType.shaderQualifiers.localSize[i]))
                     error(loc, "cannot change previously set size", "local_size", "");
                 else {
-                    int max;
+                    int max = 0;
                     switch (i) {
                     case 0: max = resources.maxComputeWorkGroupSizeX; break;
                     case 1: max = resources.maxComputeWorkGroupSizeY; break;
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index 388c16b..90b22df 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -160,7 +160,7 @@
 
     void setLayoutQualifier(TSourceLoc, TPublicType&, TString&);
     void setLayoutQualifier(TSourceLoc, TPublicType&, TString&, const TIntermTyped*);
-    void mergeObjectLayoutQualifiers(TSourceLoc, TQualifier& dest, const TQualifier& src, bool inheritOnly);
+    void mergeObjectLayoutQualifiers(TQualifier& dest, const TQualifier& src, bool inheritOnly);
     void layoutObjectCheck(TSourceLoc, const TSymbol&);
     void layoutTypeCheck(TSourceLoc, const TType&);
     void layoutQualifierCheck(TSourceLoc, const TQualifier&);
@@ -178,8 +178,8 @@
     TIntermTyped* constructBuiltIn(const TType&, TOperator, TIntermTyped*, TSourceLoc, bool subset);
     void declareBlock(TSourceLoc, TTypeList& typeList, const TString* instanceName = 0, TArraySizes* arraySizes = 0);
     void fixBlockLocations(TSourceLoc, TQualifier&, TTypeList&, bool memberWithLocation, bool memberWithoutLocation);
-    void fixBlockXfbOffsets(TSourceLoc, TQualifier&, TTypeList&);
-    void fixBlockUniformOffsets(TSourceLoc, TQualifier&, TTypeList&);
+    void fixBlockXfbOffsets(TQualifier&, TTypeList&);
+    void fixBlockUniformOffsets(TQualifier&, TTypeList&);
     void addQualifierToExisting(TSourceLoc, TQualifier, const TString& identifier);
     void addQualifierToExisting(TSourceLoc, TQualifier, TIdentifierList&);
     void invariantCheck(TSourceLoc, const TQualifier&);
@@ -221,7 +221,7 @@
     TVariable* makeInternalVariable(const char* name, const TType&) const;
     TVariable* declareNonArray(TSourceLoc, TString& identifier, TType&, bool& newDeclaration);
     void declareArray(TSourceLoc, TString& identifier, const TType&, TSymbol*&, bool& newDeclaration);
-    TIntermNode* executeInitializer(TSourceLoc, TString& identifier, TIntermTyped* initializer, TVariable* variable);
+    TIntermNode* executeInitializer(TSourceLoc, TIntermTyped* initializer, TVariable* variable);
     TIntermTyped* convertInitializerList(TSourceLoc, const TType&, TIntermTyped* initializer);
     TOperator mapTypeToConstructorOp(const TType&) const;
     void finalErrorCheck();
@@ -263,6 +263,9 @@
     TLimits& limits;
 
 protected:
+    TParseContext(TParseContext&);
+    TParseContext& operator=(TParseContext&);
+
     TScanContext* scanContext;
     TPpContext* ppContext;
     TInputScanner* currentScanner;
diff --git a/glslang/MachineIndependent/PoolAlloc.cpp b/glslang/MachineIndependent/PoolAlloc.cpp
index 26b371a..a0d8a7e 100644
--- a/glslang/MachineIndependent/PoolAlloc.cpp
+++ b/glslang/MachineIndependent/PoolAlloc.cpp
@@ -183,7 +183,11 @@
 //
 // Check a single guard block for damage
 //
+#ifdef GUARD_BLOCKS
 void TAllocation::checkGuardBlock(unsigned char* blockMem, unsigned char val, const char* locText) const
+#else
+void TAllocation::checkGuardBlock(unsigned char*, unsigned char, const char*) const
+#endif
 {
 #ifdef GUARD_BLOCKS
     for (int x = 0; x < guardBlockSize; x++) {
diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp
index 55ebcea..6c56c1c 100644
--- a/glslang/MachineIndependent/Scan.cpp
+++ b/glslang/MachineIndependent/Scan.cpp
@@ -249,7 +249,7 @@
         for (profileLength = 0; profileLength < maxProfileLength; ++profileLength) {
             if (c < 0 || c == ' ' || c == '\t' || c == '\n' || c == '\r')
                 break;
-            profileString[profileLength] = c;
+            profileString[profileLength] = (char)c;
             c = get();
         }
         if (c > 0 && c != ' ' && c != '\t' && c != '\n' && c != '\r') {
@@ -274,6 +274,9 @@
     explicit TParserToken(YYSTYPE& b) : sType(b) { }
 
     YYSTYPE& sType;
+protected:
+    TParserToken(TParserToken&);
+    TParserToken& operator=(TParserToken&);
 };
 
 } // end namespace glslang
@@ -594,7 +597,7 @@
                                    
         default:
             char buf[2];
-            buf[0] = ppToken.token;
+            buf[0] = (char)ppToken.token;
             buf[1] = 0;
             parseContext.error(loc, "unexpected token", buf, "");
             break;
diff --git a/glslang/MachineIndependent/ScanContext.h b/glslang/MachineIndependent/ScanContext.h
index 621c771..5f1ffb5 100644
--- a/glslang/MachineIndependent/ScanContext.h
+++ b/glslang/MachineIndependent/ScanContext.h
@@ -57,6 +57,9 @@
     int tokenize(TPpContext*, TParserToken&);
 
 protected:
+    TScanContext(TScanContext&);
+    TScanContext& operator=(TScanContext&);
+
     int tokenizeIdentifier();
     int identifierOrType();
     int reservedWord();
diff --git a/glslang/MachineIndependent/ShaderLang.cpp b/glslang/MachineIndependent/ShaderLang.cpp
index 9178df2..cf485bf 100644
--- a/glslang/MachineIndependent/ShaderLang.cpp
+++ b/glslang/MachineIndependent/ShaderLang.cpp
@@ -688,7 +688,7 @@
     const int* inputLengths,
     const EShOptimizationLevel optLevel,
     const TBuiltInResource* resources,
-    int debugOptions,          // currently unused
+    int /*debugOptions*/,
     int defaultVersion,        // use 100 for ES environment, 110 for desktop
     bool forwardCompatible,    // give errors for use of deprecated features
     EShMessages messages       // warnings/errors/AST; things to print out
@@ -730,36 +730,6 @@
 // Return:  The return value of is really boolean, indicating
 // success or failure.
 //
-int ShLink(
-    const ShHandle linkHandle,
-    const ShHandle compHandles[],
-    const int numHandles,
-    ShHandle uniformMapHandle,
-    short int** uniformsAccessed,
-    int* numUniformsAccessed)
-
-{
-    if (!InitThread())
-        return 0;
-
-    TShHandleBase* base = reinterpret_cast<TShHandleBase*>(linkHandle);
-    TLinker* linker = static_cast<TLinker*>(base->getAsLinker());
-    if (linker == 0)
-        return 0;
-
-    int returnValue;
-    GetThreadPoolAllocator().push();
-    returnValue = ShLinkExt(linkHandle, compHandles, numHandles);
-    GetThreadPoolAllocator().pop();
-
-    if (returnValue)
-        return 1;
-
-    return 0;
-}
-//
-// This link method will be eventually used once the ICD supports the new linker interface
-//
 int ShLinkExt(
     const ShHandle linkHandle,
     const ShHandle compHandles[],
@@ -835,6 +805,8 @@
         infoSink = &(base->getAsCompiler()->getInfoSink());
     else if (base->getAsLinker())
         infoSink = &(base->getAsLinker()->getInfoSink());
+    else
+        return 0;
 
     infoSink->info << infoSink->debug.c_str();
     return infoSink->info.c_str();
@@ -990,7 +962,7 @@
 class TDeferredCompiler : public TCompiler {
 public:
     TDeferredCompiler(EShLanguage s, TInfoSink& i) : TCompiler(s, i) { }
-    virtual bool compile(TIntermNode* root, int version = 0, EProfile profile = ENoProfile) { return true; }
+    virtual bool compile(TIntermNode*, int = 0, EProfile = ENoProfile) { return true; }
 };
 
 TShader::TShader(EShLanguage s) 
diff --git a/glslang/MachineIndependent/glslang.y b/glslang/MachineIndependent/glslang.y
index f398acf..148590f 100644
--- a/glslang/MachineIndependent/glslang.y
+++ b/glslang/MachineIndependent/glslang.y
@@ -1027,7 +1027,7 @@
     | layout_qualifier_id_list COMMA layout_qualifier_id {
         $$ = $1;
         $$.shaderQualifiers.merge($3.shaderQualifiers);
-        parseContext.mergeObjectLayoutQualifiers($2.loc, $$.qualifier, $3.qualifier, false);
+        parseContext.mergeObjectLayoutQualifiers($$.qualifier, $3.qualifier, false);
     }
 
 layout_qualifier_id
diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp
index 681a9ee..000ee10 100644
--- a/glslang/MachineIndependent/intermOut.cpp
+++ b/glslang/MachineIndependent/intermOut.cpp
@@ -67,6 +67,9 @@
     virtual bool visitSwitch(TVisit, TIntermSwitch* node);
 
     TInfoSink& infoSink;
+protected:
+    TOutputTraverser(TOutputTraverser&);
+    TOutputTraverser& operator=(TOutputTraverser&);
 };
 
 //
diff --git a/glslang/MachineIndependent/limits.cpp b/glslang/MachineIndependent/limits.cpp
index 08f873b..4573d28 100644
--- a/glslang/MachineIndependent/limits.cpp
+++ b/glslang/MachineIndependent/limits.cpp
@@ -74,6 +74,10 @@
     TSymbolTable& symbolTable;
     bool bad;
     TSourceLoc badLoc;
+
+protected:
+    TInductiveTraverser(TInductiveTraverser&);
+    TInductiveTraverser& operator=(TInductiveTraverser&);
 };
 
 // check binary operations for those modifying the loop index
@@ -152,6 +156,10 @@
     const TIdSetType& inductiveLoopIds;
     bool bad;
     TSourceLoc badLoc;
+
+protected:
+    TIndexTraverser(TIndexTraverser&);
+    TIndexTraverser& operator=(TIndexTraverser&);
 };
 
 // make sure symbols are inductive-loop indexes
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index db60a06..51364c2 100644
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -285,7 +285,7 @@
     int addUsedOffsets(int binding, int offset, int numOffsets);
     int computeTypeLocationSize(const TType&) const;
 
-    bool setXfbBufferStride(int buffer, int stride)
+    bool setXfbBufferStride(int buffer, unsigned stride)
     {
         if (xfbBuffers[buffer].stride != TQualifier::layoutXfbStrideEnd)
             return xfbBuffers[buffer].stride == stride;
diff --git a/glslang/MachineIndependent/parseConst.cpp b/glslang/MachineIndependent/parseConst.cpp
index 978dc8a..90621d3 100644
--- a/glslang/MachineIndependent/parseConst.cpp
+++ b/glslang/MachineIndependent/parseConst.cpp
@@ -62,6 +62,10 @@
     bool isMatrix;
     int matrixCols;
     int matrixRows;
+
+protected:
+    TConstTraverser(TConstTraverser&);
+    TConstTraverser& operator=(TConstTraverser&);
 };
 
 bool TConstTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node)
diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp
index 85f24f8..4b04fed 100644
--- a/glslang/MachineIndependent/preprocessor/Pp.cpp
+++ b/glslang/MachineIndependent/preprocessor/Pp.cpp
@@ -454,8 +454,8 @@
 
                 return token;
             }
-            Symbol* s;
-            res = (s = LookUpSymbol(ppToken->atom)) ? !s->mac.undef : 0;
+            Symbol* s = LookUpSymbol(ppToken->atom);
+            res = s ? ! s->mac.undef : 0;
             token = scanToken(ppToken);
             if (needclose) {
                 if (token != ')') {
@@ -690,8 +690,6 @@
 int TPpContext::CPPpragma(TPpToken* ppToken)
 {
     char SrcStrName[2];
-    int tokenCount = 0;
-    int maxTokenCount = 10;
     const char* SrcStr;
     TVector<TString> tokens;
 
@@ -711,7 +709,7 @@
             tokens.push_back(SrcStr);
             break;
         default:
-            SrcStrName[0] = token;
+            SrcStrName[0] = (char)token;
             SrcStrName[1] = '\0';
             tokens.push_back(SrcStrName);
         }
@@ -887,7 +885,7 @@
 
     n = new TokenStream;
     pushInput(new tMarkerInput(this));
-    pushTokenStreamInput(a, 0);
+    pushTokenStreamInput(a);
     while ((token = scanToken(ppToken)) != tMarkerInput::marker) {
         if (token == CPP_IDENTIFIER && MacroExpand(ppToken->atom, ppToken, false, newLineOkay) != 0)
             continue;
@@ -916,7 +914,7 @@
             if (mac->args[i] == ppToken->atom) 
                 break;
         if (i >= 0) {
-            pp->pushTokenStreamInput(args[i], ppToken->atom);
+            pp->pushTokenStreamInput(args[i]);
 
             return pp->scanToken(ppToken);
         }
diff --git a/glslang/MachineIndependent/preprocessor/PpContext.cpp b/glslang/MachineIndependent/preprocessor/PpContext.cpp
index 862086e..41d7f4e 100644
--- a/glslang/MachineIndependent/preprocessor/PpContext.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpContext.cpp
@@ -87,7 +87,7 @@
     preamble(0), strings(0), parseContext(pc), inComment(false)
 {
     InitAtomTable();
-    InitScanner(this);
+    InitScanner();
 
     ifdepth = 0;
     for (elsetracker = 0; elsetracker < maxIfNesting; elsetracker++)
diff --git a/glslang/MachineIndependent/preprocessor/PpContext.h b/glslang/MachineIndependent/preprocessor/PpContext.h
index fabe7ce..0a1c2b3 100644
--- a/glslang/MachineIndependent/preprocessor/PpContext.h
+++ b/glslang/MachineIndependent/preprocessor/PpContext.h
@@ -193,6 +193,9 @@
     TSymbolMap symbols; // this has light use... just defined macros
 
 protected:
+    TPpContext(TPpContext&);
+    TPpContext& operator=(TPpContext&);
+
     char*   preamble;               // string to parse, all before line 1 of string 0, it is 0 if no preamble
     int     preambleLength;
     char**  strings;                // official strings of shader, starting a string 0 line 1
@@ -342,7 +345,7 @@
     void RecordToken(TokenStream* pTok, int token, TPpToken* ppToken);
     void RewindTokenStream(TokenStream *pTok);
     int ReadToken(TokenStream* pTok, TPpToken* ppToken);
-    void pushTokenStreamInput(TokenStream *ts, int name);
+    void pushTokenStreamInput(TokenStream *ts);
     void UngetToken(int token, TPpToken* ppToken);
     
     class tTokenInput : public tInput {
@@ -445,7 +448,7 @@
         TInputScanner* input;
     };
 
-    int InitScanner(TPpContext* cpp);
+    int InitScanner();
     int ScanFromString(char* s);
     void missingEndifCheck();
     int lFloatConst(int len, int ch, TPpToken* ppToken);
diff --git a/glslang/MachineIndependent/preprocessor/PpMemory.cpp b/glslang/MachineIndependent/preprocessor/PpMemory.cpp
index b71d2cf..4448a4b 100644
--- a/glslang/MachineIndependent/preprocessor/PpMemory.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpMemory.cpp
@@ -95,8 +95,6 @@
 
 TPpContext::MemoryPool* TPpContext::mem_CreatePool(size_t chunksize, unsigned int align)
 {
-    MemoryPool  *pool;
-
     if (align == 0)
         align = ALIGN;
     if (chunksize == 0)
@@ -107,7 +105,9 @@
         return 0;
     if (chunksize & (align - 1))
         return 0;
-    if (!(pool = (MemoryPool*)malloc(chunksize)))
+
+    MemoryPool *pool = (MemoryPool*)malloc(chunksize);
+    if (! pool)
         return 0;
 
     pool->next = 0;
diff --git a/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
index e0f3b55..5c301d3 100644
--- a/glslang/MachineIndependent/preprocessor/PpScanner.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpScanner.cpp
@@ -92,7 +92,7 @@
 
 namespace glslang {
 
-int TPpContext::InitScanner(TPpContext *cpp)
+int TPpContext::InitScanner()
 {
     // Add various atoms needed by the CPP line scanner:
     if (!InitCPP())
@@ -127,13 +127,13 @@
     char* str = ppToken->name;
     if (ch == '.') {
         HasDecimalOrExponent = true;
-        str[len++]=ch;
+        str[len++] = (char)ch;
         ch = getChar();
         while (ch >= '0' && ch <= '9') {
             if (len < TPpToken::maxTokenLength) {
                 declen++;
                 if (len > 0 || ch != '0') {
-                    str[len] = ch;
+                    str[len] = (char)ch;
                     len++;
                     str_len++;
                 }
@@ -155,21 +155,21 @@
             len = 1,str_len=1;
         } else {
             ExpSign = 1;
-            str[len++]=ch;
+            str[len++] = (char)ch;
             ch = getChar();
             if (ch == '+') {
-                str[len++]=ch;  
+                str[len++] = (char)ch;
                 ch = getChar();
             } else if (ch == '-') {
                 ExpSign = -1;
-                str[len++]=ch;
+                str[len++] = (char)ch;
                 ch = getChar();
             }
             if (ch >= '0' && ch <= '9') {
                 while (ch >= '0' && ch <= '9') {
                     if (len < TPpToken::maxTokenLength) {
                         exp = exp*10 + ch - '0';
-                        str[len++]=ch;
+                        str[len++] = (char)ch;
                         ch = getChar();
                     } else {
                         parseContext.error(ppToken->loc, "float literal too long", "", "");
@@ -197,8 +197,8 @@
                 ungetChar();
             } else {
                 if (len < TPpToken::maxTokenLength) {
-                    str[len++] = ch;
-                    str[len++] = ch2;
+                    str[len++] = (char)ch;
+                    str[len++] = (char)ch2;
                     isDouble = 1;
                 } else {
                     parseContext.error(ppToken->loc, "float literal too long", "", "");
@@ -212,7 +212,7 @@
             if (! HasDecimalOrExponent)
                 parseContext.error(ppToken->loc, "float literal needs a decimal point or exponent", "", "");
             if (len < TPpToken::maxTokenLength)
-                str[len++] = ch;
+                str[len++] = (char)ch;
             else {
                 parseContext.error(ppToken->loc, "float literal too long", "", "");
                 len = 1,str_len=1;
@@ -238,7 +238,9 @@
 {
     char tokenText[TPpToken::maxTokenLength + 1];
     int AlreadyComplained = 0;
-    int len, ch, ii;
+    int len = 0;
+    int ch = 0;
+    int ii = 0;
     unsigned ival = 0;
 
     ppToken->ival = 0;
@@ -273,7 +275,7 @@
         case 'z':
             do {
                 if (len < TPpToken::maxTokenLength) {
-                    tokenText[len++] = ch;
+                    tokenText[len++] = (char)ch;
                     ch = pp->getChar();					
                 } else {
                     if (! AlreadyComplained) {
@@ -297,13 +299,13 @@
 
             return CPP_IDENTIFIER;
         case '0':
-            ppToken->name[len++] = ch;
+            ppToken->name[len++] = (char)ch;
             ch = pp->getChar();
             if (ch == 'x' || ch == 'X') {
                 // must be hexidecimal
 
                 bool isUnsigned = false;
-                ppToken->name[len++] = ch;
+                ppToken->name[len++] = (char)ch;
                 ch = pp->getChar();
                 if ((ch >= '0' && ch <= '9') ||
                     (ch >= 'A' && ch <= 'F') ||
@@ -312,7 +314,7 @@
                     ival = 0;
                     do {
                         if (ival <= 0x0fffffff) {
-                            ppToken->name[len++] = ch;
+                            ppToken->name[len++] = (char)ch;
                             if (ch >= '0' && ch <= '9') {
                                 ii = ch - '0';
                             } else if (ch >= 'A' && ch <= 'F') {
@@ -338,7 +340,7 @@
                 }
                 if (ch == 'u' || ch == 'U') {
                     if (len < TPpToken::maxTokenLength)
-                        ppToken->name[len++] = ch;
+                        ppToken->name[len++] = (char)ch;
                     isUnsigned = true;
                 } else
                     pp->ungetChar();
@@ -360,7 +362,7 @@
                 // see how much octal-like stuff we can read
                 while (ch >= '0' && ch <= '7') {
                     if (len < TPpToken::maxTokenLength)
-                        ppToken->name[len++] = ch;
+                        ppToken->name[len++] = (char)ch;
                     else if (! AlreadyComplained) {
                         pp->parseContext.error(ppToken->loc, "numeric literal too long", "", "");
                         AlreadyComplained = 1;
@@ -378,7 +380,7 @@
                     nonOctal = true;
                     do {
                         if (len < TPpToken::maxTokenLength)
-                            ppToken->name[len++] = ch;
+                            ppToken->name[len++] = (char)ch;
                         else if (! AlreadyComplained) {
                             pp->parseContext.error(ppToken->loc, "numeric literal too long", "", "");
                             AlreadyComplained = 1;
@@ -395,7 +397,7 @@
 
                 if (ch == 'u' || ch == 'U') {
                     if (len < TPpToken::maxTokenLength)
-                        ppToken->name[len++] = ch;
+                        ppToken->name[len++] = (char)ch;
                     isUnsigned = true;
                 } else
                     pp->ungetChar();
@@ -418,7 +420,7 @@
 
             do {
                 if (len < TPpToken::maxTokenLength)
-                    ppToken->name[len++] = ch;
+                    ppToken->name[len++] = (char)ch;
                 else if (! AlreadyComplained) {
                     pp->parseContext.error(ppToken->loc, "numeric literal too long", "", "");
                     AlreadyComplained = 1;
@@ -433,7 +435,7 @@
                 int uint = 0;
                 if (ch == 'u' || ch == 'U') {
                     if (len < TPpToken::maxTokenLength)
-                        ppToken->name[len++] = ch;
+                        ppToken->name[len++] = (char)ch;
                     uint = 1;
                 } else
                     pp->ungetChar();
@@ -442,9 +444,9 @@
                 ival = 0;
                 for (ii = 0; ii < numericLen; ii++) {
                     ch = ppToken->name[ii] - '0';
-                    if ((ival > 429496729) || (ival == 429496729 && ch >= 6)) {
+                    if ((ival > 0x19999999u) || (ival == 0x19999999u && ch >= 6)) {
                         pp->parseContext.error(ppToken->loc, "numeric literal too big", "", "");
-                        ival = -1;
+                        ival = 0xFFFFFFFFu;
                         break;
                     } else
                         ival = ival * 10 + ch;
@@ -651,7 +653,7 @@
             ch = pp->getChar();
             while (ch != '"' && ch != '\n' && ch != EOF) {
                 if (len < TPpToken::maxTokenLength) {
-                    tokenText[len] = ch;
+                    tokenText[len] = (char)ch;
                     len++;
                     ch = pp->getChar();
                 } else
diff --git a/glslang/MachineIndependent/preprocessor/PpTokens.cpp b/glslang/MachineIndependent/preprocessor/PpTokens.cpp
index b7cc0d3..794cb24 100644
--- a/glslang/MachineIndependent/preprocessor/PpTokens.cpp
+++ b/glslang/MachineIndependent/preprocessor/PpTokens.cpp
@@ -197,7 +197,7 @@
         ch = lReadByte(pTok);
         while (ch != 0) {
             if (len < TPpToken::maxTokenLength) {
-                tokenText[len] = ch;
+                tokenText[len] = (char)ch;
                 len++;
                 ch = lReadByte(pTok);
             } else {
@@ -239,7 +239,7 @@
     return pp->ReadToken(tokens, ppToken);
 }
 
-void TPpContext::pushTokenStreamInput(TokenStream* ts, int name)
+void TPpContext::pushTokenStreamInput(TokenStream* ts)
 {
     pushInput(new tTokenInput(this, ts));
     RewindTokenStream(ts);
diff --git a/glslang/MachineIndependent/reflection.cpp b/glslang/MachineIndependent/reflection.cpp
index fa5a912..60b04ba 100644
--- a/glslang/MachineIndependent/reflection.cpp
+++ b/glslang/MachineIndependent/reflection.cpp
@@ -618,6 +618,10 @@
     const TIntermediate& intermediate;
     TReflection& reflection;
     std::set<const TIntermNode*> processedDerefs;
+
+protected:
+    TLiveTraverser(TLiveTraverser&);
+    TLiveTraverser& operator=(TLiveTraverser&);
 };
 
 //
