return D;
}
+ /// \brief Returns the most recent (re)declaration of this declaration.
+ const decl_type *getMostRecentDeclaration() const {
+ return getFirstDeclaration()->RedeclLink.getNext();
+ }
+
/// \brief Set the previous declaration. If PrevDecl is NULL, set this as the
/// first and only declaration.
void setPreviousDeclaration(decl_type *PrevDecl) {
}
static bool isInCLinkageSpecification(const Decl *D) {
+ D = D->getCanonicalDecl();
for (const DeclContext *DC = D->getDeclContext();
!DC->isTranslationUnit(); DC = DC->getParent()) {
if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))
"Mangling declaration");
CXXNameMangler Mangler(Context, os);
- if (!Mangler.mangle(cast<NamedDecl>(D->getCanonicalDecl())))
+ if (!Mangler.mangle(D))
return false;
os.flush();
-// RUN: clang-cc -triple i386-pc-linux-gnu -emit-llvm -o %t %s &&
-// RUN: grep '@_Z2f0i' %t &&
-// RUN: grep '@_Z2f0l' %t &&
+// RUN: clang-cc -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck %s
-// Make sure we mangle overloadable, even in C system headers.
+// CHECK: @"\01foo"
+// Make sure we mangle overloadable, even in C system headers.
# 1 "somesystemheader.h" 1 3 4
+// CHECK: @_Z2f0i
void __attribute__((__overloadable__)) f0(int a) {}
+// CHECK: @_Z2f0l
void __attribute__((__overloadable__)) f0(long b) {}
-
+// CHECK: @"\01bar"
// These should get merged.
void foo() __asm__("bar");
void foo2() __asm__("bar");
-// RUN: grep '@"\\01foo"' %t &&
-// RUN: grep '@"\\01bar"' %t
-
int nux __asm__("foo");
extern float nux2 __asm__("foo");
int foo7 __asm__("foo7") __attribute__((used));
float foo8 __asm__("foo7") = 42;
+
+// PR4412
+int func(void);
+extern int func (void) __asm__ ("FUNC");
+
+// CHECK: @"\01FUNC"
+int func(void) {
+ return 42;
+}