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 &);
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);
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{
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 &);
protected:
const ArraySpec &arraySpec();
+ void set_arraySpec(const ArraySpec arraySpec) { arraySpec_ = arraySpec; }
const ArraySpec &coarraySpec();
void BeginArraySpec();
void EndArraySpec();
void DeclarationVisitor::Post(const parser::PointerDecl &x) {
const auto &name{std::get<parser::Name>(x.t)};
- Symbol &symbol{DeclareUnknownEntity(name, Attrs{Attr::POINTER})};
- symbol.ReplaceName(name.source);
+ if (const auto &deferredShapeSpecs{
+ std::get<std::optional<parser::DeferredShapeSpecList>>(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) {
! 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
type(B) :: cb1[5:*], cb2(*)[2, -1:*]
type(C) :: c1
+ pointer :: c2(:, :)
+ pointer :: varLocal(:)
class(*), allocatable :: var(:), cvar(:)[:]
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)[*])