diff --git a/flang/lib/Semantics/resolve-names-utils.h b/flang/lib/Semantics/resolve-names-utils.h --- a/flang/lib/Semantics/resolve-names-utils.h +++ b/flang/lib/Semantics/resolve-names-utils.h @@ -100,6 +100,8 @@ ArraySpec AnalyzeArraySpec(SemanticsContext &, const parser::ArraySpec &); ArraySpec AnalyzeArraySpec( SemanticsContext &, const parser::ComponentArraySpec &); +ArraySpec AnalyzeDeferredShapeSpecList( + SemanticsContext &, const parser::DeferredShapeSpecList &); ArraySpec AnalyzeCoarraySpec( SemanticsContext &context, const parser::CoarraySpec &); diff --git a/flang/lib/Semantics/resolve-names-utils.cpp b/flang/lib/Semantics/resolve-names-utils.cpp --- a/flang/lib/Semantics/resolve-names-utils.cpp +++ b/flang/lib/Semantics/resolve-names-utils.cpp @@ -219,6 +219,7 @@ public: ArraySpecAnalyzer(SemanticsContext &context) : context_{context} {} ArraySpec Analyze(const parser::ArraySpec &); + ArraySpec AnalyzeDeferredShapeSpecList(const parser::DeferredShapeSpecList &); ArraySpec Analyze(const parser::ComponentArraySpec &); ArraySpec Analyze(const parser::CoarraySpec &); @@ -252,6 +253,11 @@ SemanticsContext &context, const parser::ComponentArraySpec &arraySpec) { return ArraySpecAnalyzer{context}.Analyze(arraySpec); } +ArraySpec AnalyzeDeferredShapeSpecList(SemanticsContext &context, + const parser::DeferredShapeSpecList &deferredShapeSpecs) { + return ArraySpecAnalyzer{context}.AnalyzeDeferredShapeSpecList( + deferredShapeSpecs); +} ArraySpec AnalyzeCoarraySpec( SemanticsContext &context, const parser::CoarraySpec &coarraySpec) { return ArraySpecAnalyzer{context}.Analyze(coarraySpec); @@ -275,6 +281,12 @@ CHECK(!arraySpec_.empty()); return arraySpec_; } +ArraySpec ArraySpecAnalyzer::AnalyzeDeferredShapeSpecList( + const parser::DeferredShapeSpecList &x) { + Analyze(x); + CHECK(!arraySpec_.empty()); + return arraySpec_; +} ArraySpec ArraySpecAnalyzer::Analyze(const parser::CoarraySpec &x) { std::visit( common::visitors{ diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -429,6 +429,7 @@ protected: const ArraySpec &arraySpec(); + void set_arraySpec(const ArraySpec arraySpec) { arraySpec_ = arraySpec; } const ArraySpec &coarraySpec(); void BeginArraySpec(); void EndArraySpec(); @@ -3250,8 +3251,18 @@ void DeclarationVisitor::Post(const parser::PointerDecl &x) { const auto &name{std::get(x.t)}; - Symbol &symbol{DeclareUnknownEntity(name, Attrs{Attr::POINTER})}; - symbol.ReplaceName(name.source); + if (const auto &deferredShapeSpecs{ + std::get>(x.t)}) { + CHECK(arraySpec().empty()); + BeginArraySpec(); + set_arraySpec(AnalyzeDeferredShapeSpecList(context(), *deferredShapeSpecs)); + Symbol &symbol{DeclareObjectEntity(name, Attrs{Attr::POINTER})}; + symbol.ReplaceName(name.source); + EndArraySpec(); + } else { + Symbol &symbol{DeclareUnknownEntity(name, Attrs{Attr::POINTER})}; + symbol.ReplaceName(name.source); + } } bool DeclarationVisitor::Pre(const parser::BindEntity &x) { diff --git a/flang/test/Semantics/allocate12.f90 b/flang/test/Semantics/allocate12.f90 --- a/flang/test/Semantics/allocate12.f90 +++ b/flang/test/Semantics/allocate12.f90 @@ -1,7 +1,7 @@ ! RUN: %S/test_errors.sh %s %t %f18 ! Check for semantic errors in ALLOCATE statements -subroutine C941_C942b_C950(xsrc, x1, a2, b2, cx1, ca2, cb1, cb2, c1) +subroutine C941_C942b_C950(xsrc, x1, a2, b2, cx1, ca2, cb1, cb2, c1, c2) ! C941: An allocate-coarray-spec shall appear if and only if the allocate-object ! is a coarray. type type0 @@ -40,6 +40,8 @@ type(B) :: cb1[5:*], cb2(*)[2, -1:*] type(C) :: c1 + pointer :: c2(:, :) + pointer :: varLocal(:) class(*), allocatable :: var(:), cvar(:)[:] @@ -48,6 +50,8 @@ allocate(a1, a2(10), ca1[2, -1:*], ca2(10)[*]) allocate(b1%x, b2(1)%x, cb1%x, cb2(1)%x, SOURCE=xsrc) allocate(c1%x(-1:10, 1:5), c1%cx(-1:10, 1:5)[-1:5, 1:2, 2:*]) + allocate(c2(9, 27)) + allocate(varLocal(64)) allocate(A:: var(5), cvar(10)[*])