forked from OSchip/llvm-project
Add workaround for Sema issue found in <rdar://problem/9188004>, which leads to an assertion failure in the uninitialized variables analysis. The problem is that Sema isn't properly registering a variable in a DeclContext (which -Wuninitialized relies on), but
my expertise on the template instantiation logic isn't good enough to fix this problem for real. This patch worksaround the problem in -Wuninitialized, but we should fix it for real later. llvm-svn: 128443
This commit is contained in:
parent
6454e15f49
commit
03325c4be9
|
@ -51,7 +51,7 @@ public:
|
|||
unsigned size() const { return map.size(); }
|
||||
|
||||
/// Returns the bit vector index for a given declaration.
|
||||
llvm::Optional<unsigned> getValueIndex(const VarDecl *d);
|
||||
llvm::Optional<unsigned> getValueIndex(const VarDecl *d) const;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -66,8 +66,8 @@ void DeclToIndex::computeMap(const DeclContext &dc) {
|
|||
}
|
||||
}
|
||||
|
||||
llvm::Optional<unsigned> DeclToIndex::getValueIndex(const VarDecl *d) {
|
||||
llvm::DenseMap<const VarDecl *, unsigned>::iterator I = map.find(d);
|
||||
llvm::Optional<unsigned> DeclToIndex::getValueIndex(const VarDecl *d) const {
|
||||
llvm::DenseMap<const VarDecl *, unsigned>::const_iterator I = map.find(d);
|
||||
if (I == map.end())
|
||||
return llvm::Optional<unsigned>();
|
||||
return I->second;
|
||||
|
@ -152,6 +152,10 @@ public:
|
|||
return declToIndex.size() == 0;
|
||||
}
|
||||
|
||||
bool hasEntry(const VarDecl *vd) const {
|
||||
return declToIndex.getValueIndex(vd).hasValue();
|
||||
}
|
||||
|
||||
void resetScratch();
|
||||
ValueVector &getScratch() { return scratch; }
|
||||
|
||||
|
@ -379,7 +383,13 @@ public:
|
|||
void BlockStmt_VisitObjCForCollectionStmt(ObjCForCollectionStmt *fs);
|
||||
|
||||
bool isTrackedVar(const VarDecl *vd) {
|
||||
#if 1
|
||||
// FIXME: This is a temporary workaround to deal with the fact
|
||||
// that DeclContext's do not always contain all of their variables!
|
||||
return vals.hasEntry(vd);
|
||||
#else
|
||||
return ::isTrackedVar(vd, cast<DeclContext>(ac.getDecl()));
|
||||
#endif
|
||||
}
|
||||
|
||||
FindVarResult findBlockVarDecl(Expr *ex);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -fsyntax-only %s -verify
|
||||
// RUN: %clang_cc1 -fsyntax-only -Wuninitialized -fsyntax-only -fcxx-exceptions %s -verify
|
||||
|
||||
int test1_aux(int &x);
|
||||
int test1() {
|
||||
|
@ -49,3 +49,24 @@ test4_A test4() {
|
|||
return a; // expected-warning{{variable 'a' is possibly uninitialized when used here}}
|
||||
}
|
||||
|
||||
// This test previously crashed Sema.
|
||||
class Rdar9188004A {
|
||||
public:
|
||||
virtual ~Rdar9188004A();
|
||||
};
|
||||
|
||||
template< typename T > class Rdar9188004B : public Rdar9188004A {
|
||||
virtual double *foo(Rdar9188004B *next) const {
|
||||
double *values = next->foo(0);
|
||||
try {
|
||||
}
|
||||
catch(double e) {
|
||||
values[0] = e;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
class Rdar9188004C : public Rdar9188004B<Rdar9188004A> {
|
||||
virtual void bar(void) const;
|
||||
};
|
||||
void Rdar9188004C::bar(void) const {}
|
||||
|
|
Loading…
Reference in New Issue