[MS Demangler] Add ms-arg-qualifiers.test
authorZachary Turner <zturner@google.com>
Thu, 26 Jul 2018 20:25:35 +0000 (20:25 +0000)
committerZachary Turner <zturner@google.com>
Thu, 26 Jul 2018 20:25:35 +0000 (20:25 +0000)
This converts the arg qualifier mangling tests from
clang/CodeGenCXX/mangle-ms-arg-qualifiers.cpp to demangling tests.
Most tests already pass, so this patch doesn't come with any
functional change, just the addition of new tests.  The few tests
that don't pass are left in with a FIXME label so that they don't
run but serve as documentation about what still doesn't work.

llvm-svn: 338067

llvm/lib/Demangle/MicrosoftDemangle.cpp
llvm/test/Demangle/ms-arg-qualifiers.test [new file with mode: 0644]
llvm/test/Demangle/ms-mangle.test

index 1bf94ff..86a9589 100644 (file)
@@ -483,6 +483,11 @@ void Type::outputPre(OutputStream &OS, Type &Ty) {
     outputSpaceIfNecessary(OS);
     OS << "volatile";
   }
+
+  if (Ty.Quals & Q_Restrict) {
+    outputSpaceIfNecessary(OS);
+    OS << "__restrict";
+  }
 }
 
 // Write the "second half" of a given type.
@@ -574,8 +579,6 @@ void PointerType::outputPre(OutputStream &OS) {
   // FIXME: We should output this, but it requires updating lots of tests.
   // if (Ty.Quals & Q_Pointer64)
   //  OS << " __ptr64";
-  if (Quals & Q_Restrict)
-    OS << " __restrict";
 }
 
 void PointerType::outputPost(OutputStream &OS) {
diff --git a/llvm/test/Demangle/ms-arg-qualifiers.test b/llvm/test/Demangle/ms-arg-qualifiers.test
new file mode 100644 (file)
index 0000000..cf83ab0
--- /dev/null
@@ -0,0 +1,248 @@
+; These tests are based on clang/test/CodeGenCXX/mangle-ms-arg-qualifiers.cpp
+; RUN: llvm-undname < %s | FileCheck %s
+
+; CHECK-NOT: Invalid mangled name
+
+?foo@@YAXI@Z
+; CHECK: void __cdecl foo(unsigned int)
+
+?foo@@YAXN@Z  
+; CHECK: void __cdecl foo(double)
+
+?foo_pad@@YAXPAD@Z
+?foo_pad@@YAXPEAD@Z
+; CHECK: void __cdecl foo_pad(char *)
+
+?foo_pbd@@YAXPBD@Z
+?foo_pbd@@YAXPEBD@Z
+; CHECK: void __cdecl foo_pbd(char const *)
+
+?foo_pcd@@YAXPCD@Z
+?foo_pcd@@YAXPECD@Z
+; CHECK: void __cdecl foo_pcd(char volatile *)
+
+?foo_qad@@YAXQAD@Z
+?foo_qad@@YAXQEAD@Z
+; CHECK: void __cdecl foo_qad(char *const)
+
+?foo_rad@@YAXRAD@Z
+?foo_rad@@YAXREAD@Z
+; CHECK: void __cdecl foo_rad(char *volatile)
+
+?foo_sad@@YAXSAD@Z
+?foo_sad@@YAXSEAD@Z
+; CHECK: void __cdecl foo_sad(char *const volatile)
+
+?foo_piad@@YAXPIAD@Z
+?foo_piad@@YAXPEIAD@Z
+; CHECK: void __cdecl foo_piad(char *__restrict)
+
+?foo_qiad@@YAXQIAD@Z
+?foo_qiad@@YAXQEIAD@Z
+; CHECK: void __cdecl foo_qiad(char *const __restrict)
+
+?foo_riad@@YAXRIAD@Z
+?foo_riad@@YAXREIAD@Z
+; CHECK: void __cdecl foo_riad(char *volatile __restrict)
+
+?foo_siad@@YAXSIAD@Z
+?foo_siad@@YAXSEIAD@Z
+; CHECK: void __cdecl foo_siad(char *const volatile __restrict)
+
+?foo_papad@@YAXPAPAD@Z
+?foo_papad@@YAXPEAPEAD@Z
+; CHECK: void __cdecl foo_papad(char **)
+
+?foo_papbd@@YAXPAPBD@Z
+?foo_papbd@@YAXPEAPEBD@Z
+; CHECK: void __cdecl foo_papbd(char const **)
+
+?foo_papcd@@YAXPAPCD@Z
+?foo_papcd@@YAXPEAPECD@Z
+; CHECK: void __cdecl foo_papcd(char volatile **)
+
+?foo_pbqad@@YAXPBQAD@Z
+?foo_pbqad@@YAXPEBQEAD@Z
+; CHECK: void __cdecl foo_pbqad(char *const *)
+
+?foo_pcrad@@YAXPCRAD@Z
+?foo_pcrad@@YAXPECREAD@Z
+; CHECK: void __cdecl foo_pcrad(char *volatile *)
+
+?foo_qapad@@YAXQAPAD@Z
+?foo_qapad@@YAXQEAPEAD@Z
+; CHECK: void __cdecl foo_qapad(char **const)
+
+?foo_rapad@@YAXRAPAD@Z
+?foo_rapad@@YAXREAPEAD@Z
+; CHECK: void __cdecl foo_rapad(char **volatile)
+
+?foo_pbqbd@@YAXPBQBD@Z
+?foo_pbqbd@@YAXPEBQEBD@Z
+; CHECK: void __cdecl foo_pbqbd(char const *const *)
+
+?foo_pbqcd@@YAXPBQCD@Z
+?foo_pbqcd@@YAXPEBQECD@Z
+; CHECK: void __cdecl foo_pbqcd(char volatile *const *)
+
+?foo_pcrbd@@YAXPCRBD@Z
+?foo_pcrbd@@YAXPECREBD@Z
+; CHECK: void __cdecl foo_pcrbd(char const *volatile *)
+
+?foo_pcrcd@@YAXPCRCD@Z
+?foo_pcrcd@@YAXPECRECD@Z
+; CHECK: void __cdecl foo_pcrcd(char volatile *volatile *)
+
+?foo_aad@@YAXAAD@Z
+?foo_aad@@YAXAEAD@Z
+; CHECK: void __cdecl foo_aad(char &)
+
+?foo_abd@@YAXABD@Z
+?foo_abd@@YAXAEBD@Z
+; CHECK: void __cdecl foo_abd(char const &)
+
+?foo_aapad@@YAXAAPAD@Z
+?foo_aapad@@YAXAEAPEAD@Z
+; CHECK: void __cdecl foo_aapad(char *&)
+
+?foo_aapbd@@YAXAAPBD@Z
+?foo_aapbd@@YAXAEAPEBD@Z
+; CHECK: void __cdecl foo_aapbd(char const *&)
+
+?foo_abqad@@YAXABQAD@Z
+?foo_abqad@@YAXAEBQEAD@Z
+; CHECK: void __cdecl foo_abqad(char *const &)
+
+?foo_abqbd@@YAXABQBD@Z
+?foo_abqbd@@YAXAEBQEBD@Z
+; CHECK: void __cdecl foo_abqbd(char const *const &)
+
+?foo_aay144h@@YAXAAY144H@Z
+?foo_aay144h@@YAXAEAY144H@Z
+; CHECK: void __cdecl foo_aay144h(int (&)[5][5])
+
+?foo_aay144cbh@@YAXAAY144$$CBH@Z
+?foo_aay144cbh@@YAXAEAY144$$CBH@Z
+; CHECK: void __cdecl foo_aay144cbh(int const (&)[5][5])
+
+; FIXME: We don't support rvalue references yet
+; ?foo_qay144h@@YAX$$QAY144H@Z
+; ?foo_qay144h@@YAX$$QEAY144H@Z
+; FIXME: void __cdecl foo_qay144h(int (&&)[5][5])
+
+; FIXME: We don't support rvalue references yet
+; ?foo_qay144cbh@@YAX$$QAY144$$CBH@Z
+; ?foo_qay144cbh@@YAX$$QEAY144$$CBH@Z
+; FIXME: void __cdecl foo_qay144cbh(int const (&&)[5][5])
+
+?foo_p6ahxz@@YAXP6AHXZ@Z
+?foo_p6ahxz@@YAXP6AHXZ@Z
+; CHECK: void __cdecl foo_p6ahxz(int __cdecl (*)(void))
+
+?foo_a6ahxz@@YAXA6AHXZ@Z
+?foo_a6ahxz@@YAXA6AHXZ@Z
+; CHECK: void __cdecl foo_a6ahxz(int __cdecl (&)(void))
+
+; FIXME: We don't support rvalue references yet
+; ?foo_q6ahxz@@YAX$$Q6AHXZ@Z
+; ?foo_q6ahxz@@YAX$$Q6AHXZ@Z
+; FIXME: void __cdecl foo_q6ahxz(int __cdecl (&&)(void))
+
+?foo_qay04h@@YAXQAY04H@Z
+?foo_qay04h@@YAXQEAY04H@Z
+; CHECK: void __cdecl foo_qay04h(int (*const)[5])
+
+?foo_qay04cbh@@YAXQAY04$$CBH@Z
+?foo_qay04cbh@@YAXQEAY04$$CBH@Z
+; CHECK: void __cdecl foo_qay04cbh(int const (*const)[5])
+
+?foo@@YAXPAY02N@Z
+?foo@@YAXPEAY02N@Z
+; CHECK: void __cdecl foo(double (*)[3])
+
+?foo@@YAXQAN@Z
+?foo@@YAXQEAN@Z
+; CHECK: void __cdecl foo(double *const)
+
+?foo_const@@YAXQBN@Z
+?foo_const@@YAXQEBN@Z
+; CHECK: void __cdecl foo_const(double const *const)
+
+?foo_volatile@@YAXQCN@Z
+?foo_volatile@@YAXQECN@Z
+; CHECK: void __cdecl foo_volatile(double volatile *const)
+
+?foo@@YAXPAY02NQBNN@Z
+?foo@@YAXPEAY02NQEBNN@Z
+; CHECK: void __cdecl foo(double (*)[3], double const *const, double)
+
+?foo_fnptrconst@@YAXP6AXQAH@Z@Z
+?foo_fnptrconst@@YAXP6AXQEAH@Z@Z
+; CHECK: void __cdecl foo_fnptrconst(void __cdecl (*)(int *const))
+
+?foo_fnptrarray@@YAXP6AXQAH@Z@Z
+?foo_fnptrarray@@YAXP6AXQEAH@Z@Z
+; CHECK: void __cdecl foo_fnptrarray(void __cdecl (*)(int *const))
+
+; ?foo_fnptrbackref1@@YAXP6AXQAH@Z1@Z
+; ?foo_fnptrbackref1@@YAXP6AXQEAH@Z1@Z
+; FIXME: void __cdecl foo_fnptrbackref1(void __cdecl (*)(int *const), void __cdecl (*)(int *const))
+
+; ?foo_fnptrbackref2@@YAXP6AXQAH@Z1@Z
+; ?foo_fnptrbackref2@@YAXP6AXQEAH@Z1@Z
+; FIXME: void __cdecl foo_fnptrbackref2(void __cdecl (*)(int *const), void __cdecl (*)(int *const))
+
+; ?foo_fnptrbackref3@@YAXP6AXQAH@Z1@Z
+; ?foo_fnptrbackref3@@YAXP6AXQEAH@Z1@Z
+; FIXME: void __cdecl foo_fnptrbackref3(void (*)(int *const), void (*)(int *))
+
+; ?foo_fnptrbackref4@@YAXP6AXPAH@Z1@Z
+; ?foo_fnptrbackref4@@YAXP6AXPEAH@Z1@Z
+; FIXME: void __cdecl foo_fnptrbackref4(void (*)(int *), void (*)(int *const))
+
+?ret_fnptrarray@@YAP6AXQAH@ZXZ
+?ret_fnptrarray@@YAP6AXQEAH@ZXZ
+; CHECK: void __cdecl (* __cdecl ret_fnptrarray(void))(int *const)
+
+; The first argument gets mangled as-if it were written int *const
+; The second arg should not form a backref because it isn't qualified
+?mangle_no_backref0@@YAXQAHPAH@Z
+?mangle_no_backref0@@YAXQEAHPEAH@Z
+; CHECK: void __cdecl mangle_no_backref0(int *const, int *)
+
+?mangle_no_backref1@@YAXQAHQAH@Z
+?mangle_no_backref1@@YAXQEAHQEAH@Z
+; CHECK: void __cdecl mangle_no_backref1(int *const, int *const)
+
+; Pointer to function types don't backref with function types
+?mangle_no_backref2@@YAXP6AXXZP6AXXZ@Z
+?mangle_no_backref2@@YAXP6AXXZP6AXXZ@Z
+; CHECK: void __cdecl mangle_no_backref2(void __cdecl (*)(void), void __cdecl (*)(void))
+
+?mangle_yes_backref0@@YAXQAH0@Z
+?mangle_yes_backref0@@YAXQEAH0@Z
+; CHECK: void __cdecl mangle_yes_backref0(int *const, int *const)
+
+?mangle_yes_backref1@@YAXQAH0@Z
+?mangle_yes_backref1@@YAXQEAH0@Z
+; CHECK: void __cdecl mangle_yes_backref1(int *const, int *const)
+
+?mangle_yes_backref2@@YAXQBQ6AXXZ0@Z
+?mangle_yes_backref2@@YAXQEBQ6AXXZ0@Z
+; CHECK: void __cdecl mangle_yes_backref2(void __cdecl (*const *const)(void), void __cdecl (*const *const)(void))
+
+?mangle_yes_backref3@@YAXQAP6AXXZ0@Z
+?mangle_yes_backref3@@YAXQEAP6AXXZ0@Z
+; CHECK: void __cdecl mangle_yes_backref3(void __cdecl (**const)(void), void __cdecl (**const)(void))
+
+?mangle_yes_backref4@@YAXQIAH0@Z
+?mangle_yes_backref4@@YAXQEIAH0@Z
+; CHECK: void __cdecl mangle_yes_backref4(int *const __restrict, int *const __restrict)
+
+?pr23325@@YAXQBUS@@0@Z
+?pr23325@@YAXQEBUS@@0@Z
+; CHECK: void __cdecl pr23325(struct S const *const, struct S const *const)
+
+; ?vla_arg@@YAXHQAY0A@H@Z
+; ?vla_arg@@YAXHQEAY0A@H@Z
+; FIXME: void __cdecl vla_arg(int i, int (*const)[0])
index 3925a1b..ae251d0 100644 (file)
 ; CHECK: int const *const h2
 
 ?h3@@3QIAHIA
-; CHECK: int * __restrict const h3
+; CHECK: int *const __restrict h3
 
 ?h3@@3QEIAHEIA
-; CHECK: int * __restrict const h3
+; CHECK: int *const __restrict h3
 
 ?i@@3PAY0BE@HA
 ; CHECK: int (*i)[20]