/* { dg-options "-fdiagnostics-show-caret" } */

/* Adapted from https://gcc.gnu.org/wiki/ClangDiagnosticsComparison */

typedef float __m128;
void test_1 ()
{
  __m128 myvec[2];
  int const *ptr;
  myvec[1]/ptr; /* { dg-error "invalid operands to binary /" } */

/* TODO: ideally we'd underline "ptr" as well.
{ dg-begin-multiline-output "" }
   myvec[1]/ptr;
   ~~~~~~~~^
        |
        __m128
{ dg-end-multiline-output "" } */


}

struct s {};
struct t {};
extern struct s some_function (void);
extern struct t some_other_function (void);

int test_2 (void)
{
  return (some_function ()
	  + some_other_function ()); /* { dg-error "invalid operands to binary \+" } */

/* { dg-begin-multiline-output "" }
   return (some_function ()
           ~~~~~~~~~~~~~~~~
           |
           struct s
    + some_other_function ());
    ^ ~~~~~~~~~~~~~~~~~~~~~~
      |
      struct t
   { dg-end-multiline-output "" } */
}

int test_3 (struct s param_s, struct t param_t)
{
  return param_s + param_t; // { dg-error "invalid operands to binary \+" }

/* { dg-begin-multiline-output "" }
   return param_s + param_t;
                  ^
   { dg-end-multiline-output "" } */
/* TODO: ideally we'd underline both params here.  */
}

typedef struct s S;
typedef struct t T;

extern S callee_4a (void);
extern T callee_4b (void);

int test_4 (void)
{
  return callee_4a () + callee_4b (); /* { dg-error "invalid operands to binary \+" } */

/* { dg-begin-multiline-output "" }
   return callee_4a () + callee_4b ();
          ~~~~~~~~~~~~ ^ ~~~~~~~~~~~~
          |              |
          |              T {aka struct t}
          S {aka struct s}
   { dg-end-multiline-output "" } */
}

