From: peter klausler Date: Tue, 19 Feb 2019 18:08:10 +0000 (-0800) Subject: [flang] address review comments X-Git-Tag: llvmorg-12-init~9537^2~1769 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6ed79af787c65cb7c908b639c704aaecc1ac06dd;p=platform%2Fupstream%2Fllvm.git [flang] address review comments Original-commit: flang-compiler/f18@a27f240bd4d5e390e4114be9837db9d264024e08 Reviewed-on: https://github.com/flang-compiler/f18/pull/291 --- diff --git a/flang/lib/semantics/resolve-names.cc b/flang/lib/semantics/resolve-names.cc index 34e9b8b..c9b326d 100644 --- a/flang/lib/semantics/resolve-names.cc +++ b/flang/lib/semantics/resolve-names.cc @@ -2815,13 +2815,13 @@ void DeclarationVisitor::Post(const parser::DerivedTypeSpec &x) { // in this Pre() routine so that recursive use of the derived type can be // supported in the components. bool DeclarationVisitor::Pre(const parser::DerivedTypeDef &x) { - Walk(std::get>(x.t)); + auto &stmt{std::get>(x.t)}; + Walk(stmt); Walk(std::get>>(x.t)); auto &scope{currScope()}; CHECK(scope.symbol() != nullptr); CHECK(scope.symbol()->scope() == &scope); auto &details{scope.symbol()->get()}; - auto &stmt{std::get>(x.t)}; std::set paramNames; for (auto ¶mName : std::get>(stmt.statement.t)) { details.add_paramName(paramName.source); @@ -2868,14 +2868,19 @@ bool DeclarationVisitor::Pre(const parser::DerivedTypeStmt &x) { return BeginAttrs(); } void DeclarationVisitor::Post(const parser::DerivedTypeStmt &x) { + auto &name{std::get(x.t)}; // Resolve the EXTENDS() clause before creating the derived // type's symbol to foil attempts to recursively extend a type. auto *extendsName{derivedTypeInfo_.extends}; const Symbol *extendsType{nullptr}; if (extendsName != nullptr) { - extendsType = ResolveDerivedType(*extendsName); + if (extendsName->source == name.source) { + Say(extendsName->source, + "Derived type '%s' cannot extend itself"_err_en_US); + } else { + extendsType = ResolveDerivedType(*extendsName); + } } - auto &name{std::get(x.t)}; auto &symbol{MakeSymbol(name, GetAttrs(), DerivedTypeDetails{})}; derivedTypeInfo_.type = &symbol; PushScope(Scope::Kind::DerivedType, &symbol); diff --git a/flang/test/semantics/resolve44.f90 b/flang/test/semantics/resolve44.f90 index fe32325..929acbc 100644 --- a/flang/test/semantics/resolve44.f90 +++ b/flang/test/semantics/resolve44.f90 @@ -49,7 +49,7 @@ program main class(recursive3), pointer :: ok3 class(recursive3), allocatable :: ok4 end type recursive3 - !ERROR: Derived type 'recursive4' not found + !ERROR: Derived type 'recursive4' cannot extend itself type, extends(recursive4) :: recursive4 end type recursive4 end program main