From: Tim Keith Date: Mon, 24 Sep 2018 14:12:38 +0000 (-0700) Subject: [flang] Recognize complex-part-designator X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a0858885c226aa6432e879c0c3ad5798c362981d;p=platform%2Fupstream%2Fllvm.git [flang] Recognize complex-part-designator The "%RE" or "%IM" is parsed as a structure-component. If the base has type COMPLEX and the component name is one of those, allow it without comment. Note that the `parser::Name` for these components don't get symbols filled in, so we still get a warning that they are unresolved. We have to figure out how to deal with names like this that we won't have symbols for. Fixes flang-compiler/f18#188. Original-commit: flang-compiler/f18@1d4a84fe3ce2062652e024064cc8efabc3a448bc Reviewed-on: https://github.com/flang-compiler/f18/pull/194 Tree-same-pre-rewrite: false --- diff --git a/flang/lib/semantics/resolve-names.cc b/flang/lib/semantics/resolve-names.cc index bcaf475..ba09440 100644 --- a/flang/lib/semantics/resolve-names.cc +++ b/flang/lib/semantics/resolve-names.cc @@ -2595,6 +2595,13 @@ Symbol *ResolveNamesVisitor::FindComponent( if (!type) { return nullptr; // should have already reported error } + if (type->category() == DeclTypeSpec::Intrinsic && + type->intrinsicTypeSpec().category() == TypeCategory::Complex) { + auto name{component.ToString()}; + if (name == "re" || name == "im") { + return nullptr; // complex-part-designator, not structure-component + } + } if (type->category() != DeclTypeSpec::TypeDerived) { if (base.test(Symbol::Flag::Implicit)) { Say(base.lastOccurrence(), diff --git a/flang/test/semantics/CMakeLists.txt b/flang/test/semantics/CMakeLists.txt index 5d3439a..b132a46 100644 --- a/flang/test/semantics/CMakeLists.txt +++ b/flang/test/semantics/CMakeLists.txt @@ -69,6 +69,7 @@ set(SYMBOL_TESTS symbol04.f90 symbol05.f90 symbol06.f90 + symbol07.f90 ) # These test files have expected .mod file contents in the source diff --git a/flang/test/semantics/symbol07.f90 b/flang/test/semantics/symbol07.f90 new file mode 100644 index 0000000..b25161d --- /dev/null +++ b/flang/test/semantics/symbol07.f90 @@ -0,0 +1,53 @@ +! Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. + +!DEF: /main MainProgram +program main + implicit complex(z) + !DEF: /main/t DerivedType + type :: t + !DEF: /main/t/re ObjectEntity REAL(4) + real :: re + !DEF: /main/t/im ObjectEntity REAL(4) + real :: im + end type + !DEF: /main/z1 ObjectEntity COMPLEX(4) + complex z1 + !DEF: /main/w ObjectEntity TYPE(t) + !REF: /main/t + type(t) :: w + !DEF: /main/x ObjectEntity REAL(4) + !DEF: /main/y ObjectEntity REAL(4) + real x, y + !REF: /main/x + !REF: /main/z1 + x = z1%re + !REF: /main/y + !REF: /main/z1 + y = z1%im + !DEF: /main/z2 (implicit) ObjectEntity COMPLEX(4) + !REF: /main/x + z2%re = x + !REF: /main/z2 + !REF: /main/y + z2%im = y + !REF: /main/x + !REF: /main/w + !REF: /main/t/re + x = w%re + !REF: /main/y + !REF: /main/w + !REF: /main/t/im + y = w%im +end program