/* Subclasses of logical_location with knowledge of "tree".
   Copyright (C) 2022-2024 Free Software Foundation, Inc.
   Contributed by David Malcolm <dmalcolm@redhat.com>.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef GCC_TREE_LOGICAL_LOCATION_H
#define GCC_TREE_LOGICAL_LOCATION_H

#include "logical-location.h"

/* Abstract subclass of logical_location, with knowledge of "tree", but
   for no specific tree.  */

class compiler_logical_location : public logical_location
{
 protected:
  static const char *get_short_name_for_tree (tree);
  static const char *get_name_with_scope_for_tree (tree);
  static const char *get_internal_name_for_tree (tree);
  static enum logical_location_kind get_kind_for_tree (tree);
};

/* Concrete subclass of logical_location, with reference to a specific
   tree.  */

class tree_logical_location : public compiler_logical_location
{
public:
  tree_logical_location (tree decl) : m_decl (decl) {}

  const char *get_short_name () const final override;
  const char *get_name_with_scope () const final override;
  const char *get_internal_name () const final override;
  enum logical_location_kind get_kind () const final override;

private:
  tree m_decl;
};

/* Concrete subclass of logical_location, with reference to
   current_function_decl.  */

class current_fndecl_logical_location : public compiler_logical_location
{
public:
  const char *get_short_name () const final override;
  const char *get_name_with_scope () const final override;
  const char *get_internal_name () const final override;
  enum logical_location_kind get_kind () const final override;
};

#endif /* GCC_TREE_LOGICAL_LOCATION_H.  */
