// RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -verify %s #include "Inputs/cuda.h" __device__ float f0(float) __attribute__((noconvergent)); __device__ __attribute__((noconvergent)) float f1(float); [[clang::noconvergent]] __device__ float f2(float); __device__ [[clang::noconvergent(1)]] float f3(float); // expected-error@-1 {{'clang::noconvergent' attribute takes no arguments}} __device__ [[clang::noconvergent]] float g0; // expected-warning@-1 {{'clang::noconvergent' attribute only applies to functions and statements}} __device__ __attribute__((convergent)) __attribute__((noconvergent)) float f4(float); // expected-error@-1 {{'noconvergent' and 'convergent' attributes are not compatible}} // expected-note@-2 {{conflicting attribute is here}} __device__ [[clang::noconvergent]] float f5(float); __device__ [[clang::convergent]] float f5(float); // expected-error@-1 {{'clang::convergent' and 'clang::noconvergent' attributes are not compatible}} // expected-note@-3 {{conflicting attribute is here}} __device__ float f5(float x) { [[clang::noconvergent]] float y; // expected-warning@-1 {{'clang::noconvergent' attribute only applies to functions and statements}} float z; [[clang::noconvergent]] z = 1; // expected-warning@-1 {{'clang::noconvergent' attribute is ignored because there exists no call expression inside the statement}} [[clang::noconvergent]] z = f0(x); }