diff options
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/Sema.h | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 29 | 
3 files changed, 15 insertions, 18 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 93e6a06ef89..5588db79e37 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -2672,7 +2672,7 @@ public:    QualType CheckConstructorDeclarator(Declarator &D, QualType R,                                        FunctionDecl::StorageClass& SC);    void CheckConstructor(CXXConstructorDecl *Constructor); -  QualType CheckDestructorDeclarator(Declarator &D, QualType R, +  QualType CheckDestructorDeclarator(Declarator &D,                                       FunctionDecl::StorageClass& SC);    bool CheckDestructor(CXXDestructorDecl *Destructor);    void CheckConversionDeclarator(Declarator &D, QualType &R, diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 500d73eb9b4..ba84f7c2233 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -3023,7 +3023,7 @@ Sema::ActOnFunctionDeclarator(Scope* S, Declarator& D, DeclContext* DC,    } else if (Name.getNameKind() == DeclarationName::CXXDestructorName) {      // This is a C++ destructor declaration.      if (DC->isRecord()) { -      R = CheckDestructorDeclarator(D, R, SC); +      R = CheckDestructorDeclarator(D, SC);        NewFD = CXXDestructorDecl::Create(Context,                                          cast<CXXRecordDecl>(DC), diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index c59575f13b5..1c0a72bf118 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -2990,7 +2990,9 @@ QualType Sema::CheckConstructorDeclarator(Declarator &D, QualType R,    // Rebuild the function type "R" without any type qualifiers (in    // case any of the errors above fired) and with "void" as the -  // return type, since constructors don't have return types. +  // return type, since constructors don't have return types. We +  // *always* have to do this, because GetTypeForDeclarator will +  // put in a result type of "int" when none was specified.    const FunctionProtoType *Proto = R->getAs<FunctionProtoType>();    return Context.getFunctionType(Context.VoidTy, Proto->arg_type_begin(),                                   Proto->getNumArgs(), @@ -3085,7 +3087,7 @@ FTIHasSingleVoidArgument(DeclaratorChunk::FunctionTypeInfo &FTI) {  /// emit diagnostics and set the declarator to invalid.  Even if this happens,  /// will be updated to reflect a well-formed type for the destructor and  /// returned. -QualType Sema::CheckDestructorDeclarator(Declarator &D, QualType R, +QualType Sema::CheckDestructorDeclarator(Declarator &D,                                           FunctionDecl::StorageClass& SC) {    // C++ [class.dtor]p1:    //   [...] A typedef-name that names a class is a class-name @@ -3093,9 +3095,11 @@ QualType Sema::CheckDestructorDeclarator(Declarator &D, QualType R,    //   be used as the identifier in the declarator for a destructor    //   declaration.    QualType DeclaratorType = GetTypeFromParser(D.getName().DestructorName); -  if (isa<TypedefType>(DeclaratorType)) +  if (isa<TypedefType>(DeclaratorType)) {      Diag(D.getIdentifierLoc(), diag::err_destructor_typedef_name)        << DeclaratorType; +    D.setInvalidType(); +  }    // C++ [class.dtor]p2:    //   A destructor is used to destroy objects of its class type. A @@ -3109,10 +3113,9 @@ QualType Sema::CheckDestructorDeclarator(Declarator &D, QualType R,      if (!D.isInvalidType())        Diag(D.getIdentifierLoc(), diag::err_destructor_cannot_be)          << "static" << SourceRange(D.getDeclSpec().getStorageClassSpecLoc()) -        << SourceRange(D.getIdentifierLoc()) -        << FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc()); -     +        << SourceRange(D.getIdentifierLoc());      SC = FunctionDecl::None; +    D.setInvalidType();    }    if (D.getDeclSpec().hasTypeSpecifier() && !D.isInvalidType()) {      // Destructors don't have return types, but the parser will @@ -3160,17 +3163,11 @@ QualType Sema::CheckDestructorDeclarator(Declarator &D, QualType R,    // Rebuild the function type "R" without any type qualifiers or    // parameters (in case any of the errors above fired) and with    // "void" as the return type, since destructors don't have return -  // types.  -  const FunctionProtoType *Proto = R->getAs<FunctionProtoType>(); -  if (!Proto) -    return QualType(); -   +  // types. We *always* have to do this, because GetTypeForDeclarator +  // will put in a result type of "int" when none was specified. +  // FIXME: Exceptions!    return Context.getFunctionType(Context.VoidTy, 0, 0, false, 0, -                                 Proto->hasExceptionSpec(), -                                 Proto->hasAnyExceptionSpec(), -                                 Proto->getNumExceptions(), -                                 Proto->exception_begin(), -                                 Proto->getExtInfo()); +                                 false, false, 0, 0, FunctionType::ExtInfo());  }  /// CheckConversionDeclarator - Called by ActOnDeclarator to check the  | 

