diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-03-27 04:38:56 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-03-27 04:38:56 +0000 |
commit | 332975661d287082f64d260ef6ac5f36499d478f (patch) | |
tree | c28c5ae524bf80a8e45fd3dfaa76de1d9ea6802c /lib/Sema/SemaDeclCXX.cpp | |
parent | 551f48c2d96c8a519feb195d34a691c8b97b3994 (diff) |
Improve recovery when a constructor fails to type-check. Test case from Anders
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67818 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index bb306e4a0f..f22686020e 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -1289,20 +1289,22 @@ bool Sema::CheckConstructorDeclarator(Declarator &D, QualType &R, /// well-formedness, issuing any diagnostics required. Returns true if /// the constructor declarator is invalid. bool Sema::CheckConstructor(CXXConstructorDecl *Constructor) { - if (Constructor->isInvalidDecl()) + CXXRecordDecl *ClassDecl + = dyn_cast<CXXRecordDecl>(Constructor->getDeclContext()); + if (!ClassDecl) return true; - CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(Constructor->getDeclContext()); - bool Invalid = false; + bool Invalid = Constructor->isInvalidDecl(); // C++ [class.copy]p3: // A declaration of a constructor for a class X is ill-formed if // its first parameter is of type (optionally cv-qualified) X and // either there are no other parameters or else all other // parameters have default arguments. - if ((Constructor->getNumParams() == 1) || - (Constructor->getNumParams() > 1 && - Constructor->getParamDecl(1)->getDefaultArg() != 0)) { + if (!Constructor->isInvalidDecl() && + ((Constructor->getNumParams() == 1) || + (Constructor->getNumParams() > 1 && + Constructor->getParamDecl(1)->getDefaultArg() != 0))) { QualType ParamType = Constructor->getParamDecl(0)->getType(); QualType ClassTy = Context.getTagDeclType(ClassDecl); if (Context.getCanonicalType(ParamType).getUnqualifiedType() == ClassTy) { |