[pixel shader fail(sm>=6)]
String s = "text";
string s2 = "text2";
sTring s3 = "text3";

float4 main() : sv_target
{
    return 0;
}

[pixel shader]
typedef float4 sTring;
sTring var = float4(1, 2, 3, 4);

float4 main() : sv_target
{
    return 0;
}

[pixel shader fail(sm>=6)]
// Uninitialized strings are allowed for non-fx profiles
String s;

float4 main() : sv_target
{
    return 0;
}

[pixel shader fail]
typedef float4 string;

float4 main() : sv_target
{
    return 0;
}

[pixel shader fail(sm<6)]
typedef float4 String;

float4 main() : sv_target
{
    return 0;
}

[pixel shader fail(sm<6)]
float4 String;

float4 main() : sv_target
{
    return 0;
}

% This crashes on fxc using ps_5_0
[pixel shader fail]
struct
{
    float a;
    string b;
} apple = {1, "foobar"};

float4 main() : sv_target
{
    return apple.a;
}

[pixel shader fail]
struct apple
{
    float a;
    string b;
};

float4 main(struct apple ap = {1, "foobar"}) : sv_target
{
    return ap.a;
}

[pixel shader fail]
float4 main(string s = "foobar") : sv_target
{
    return 0;
}

[pixel shader fail(sm>=6)]
string strs[2] = {"foo", "bar"};

float4 main() : sv_target { return 0; }

% Test string concatenation
[pixel shader todo]
string str = "foo" "bar"
        "baz";

float4 main() : sv_target { return 0; }

% Escape sequences are hanlded differently in DXC.
% Octal, hexadecimal, and unicode escape sequences that are out of range are considered errors.
[pixel shader fail(sm>=6)]
string a = "\nAAA\tBBB\rCCC\fDDD\vEEE\sFFF";
string b = "\\AAA\"BBB\'CCC\?DDD\aEEE\bFFF\sGGG";
string c = "\52 AAA\052 BBB\0521 CCC\52a DDD\241 EEE\441 FFF\02 GGG\0 HHH";
string d = "\x AAA\x8 BBB\x2A CCC\x2A1 DDD\241 EEE";
string e = "AAA\x21111111111111121 BBB\x2ah CCC\xFFFF2a GGG\X0";
string f = "\e[41m AAA\e41 \u002a \U002a BBB\80CCC ";

float4 main() : sv_target { return 0; }


[require]
shader model >= 5.0
shader model < 6.0

[effect]
float4 f
<
    string a = "\nAAA\tBBB\rCCC\fDDD\vEEE\sFFF";
    string b = "\\AAA\"BBB\'CCC\?DDD\aEEE\bFFF\sGGG";
    string c = "\52 AAA\052 BBB\0521 CCC\52a DDD\241 EEE\441 FFF\02 GGG\0 HHH";
    string d = "\x AAA\x8 BBB\x2A CCC\x2A1 DDD\241 EEE";
    string e = "AAA\x21111111111111121 BBB\x2ah CCC\xFFFF2a GGG\X0";
    string f = "\e[41m AAA\e41 \u002a \U002a BBB\80CCC ";
>;

float4 main() : sv_target { return 0; }

// Native compiler's output is:
//
//    cbuffer $Globals
//    {
//        float4  f
//        <
//            String a = "
//    CCC     BBB
//       DDD
//          EEEsFFF";
//            String b = "\AAA"BBB'CCC?DDDEEFFFsGGG";
//            String c = "* AAA* BBB*1 CCC*a DDD¡ EEE! FFF GGG";
//            String d = "x AA BBB* CCC¡ DDD¡ EEE";
//            String e = "AAA! BBB*h CCC* GGGX0";
//            String f = "e[41m AAAe41 u002a U002a BBB80CCC ";
//        >;                                  // Offset:    0, size:   16
//    }