Index: clang/lib/Analysis/UninitializedValues.cpp =================================================================== --- clang/lib/Analysis/UninitializedValues.cpp +++ clang/lib/Analysis/UninitializedValues.cpp @@ -36,7 +36,8 @@ static bool isTrackedVar(const VarDecl *vd, const DeclContext *dc) { if (vd->isLocalVarDecl() && !vd->hasGlobalStorage() && !vd->isExceptionVariable() && !vd->isInitCapture() && - !vd->isImplicit() && vd->getDeclContext() == dc) { + !vd->isImplicit() && !vd->getType().isVolatileQualified() && + vd->getDeclContext() == dc) { QualType ty = vd->getType(); return ty->isScalarType() || ty->isVectorType() || ty->isRecordType(); } Index: clang/lib/Sema/AnalysisBasedWarnings.cpp =================================================================== --- clang/lib/Sema/AnalysisBasedWarnings.cpp +++ clang/lib/Sema/AnalysisBasedWarnings.cpp @@ -80,7 +80,7 @@ } S.Diag(L, diag) << R1 << R2; - + SourceLocation Open = SilenceableCondVal.getBegin(); if (Open.isValid()) { SourceLocation Close = SilenceableCondVal.getEnd(); Index: clang/test/Sema/uninit-variables.c =================================================================== --- clang/test/Sema/uninit-variables.c +++ clang/test/Sema/uninit-variables.c @@ -22,7 +22,7 @@ int test4() { int x; // expected-note{{initialize the variable 'x' to silence this warning}} ++x; // expected-warning{{variable 'x' is uninitialized when used here}} - return x; + return x; } int test5() { @@ -442,6 +442,21 @@ struct { struct { void *p; } a; } test55 = { { &test55.a }}; // no-warning struct { struct { void *p; } a; } test56 = { { &(test56.a) }}; // no-warning +int test57() { + volatile int x; + return x; // no-warning +} + +int init(volatile int* num) { + return 1; +} + +int test58() { + volatile int a, b, c; + if (init(&a) || init(&b) || init(&c)) {} + return a+b+c; // no-warning +} + void uninit_in_loop() { int produce(void); void consume(int);