diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp b/clang/lib/CIR/CodeGen/CIRGenModule.cpp index 87e364197ce7e..1c8945206d448 100644 --- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp @@ -1135,6 +1135,7 @@ void CIRGenModule::emitTopLevelDecl(Decl *decl) { emitGlobalOpenACCDecl(cast(decl)); break; case Decl::Enum: + case Decl::Using: // using X; [C++] case Decl::UsingDirective: // using namespace X; [C++] case Decl::Typedef: case Decl::TypeAlias: // using foo = bar; [C++11] @@ -1143,6 +1144,10 @@ void CIRGenModule::emitTopLevelDecl(Decl *decl) { assert(!cir::MissingFeatures::generateDebugInfo()); break; + // No code generation needed. + case Decl::UsingShadow: + break; + // C++ Decls case Decl::LinkageSpec: case Decl::Namespace: diff --git a/clang/test/CIR/CodeGen/namespace.cpp b/clang/test/CIR/CodeGen/namespace.cpp index caa43f960c6c2..14490d505140c 100644 --- a/clang/test/CIR/CodeGen/namespace.cpp +++ b/clang/test/CIR/CodeGen/namespace.cpp @@ -50,3 +50,46 @@ int f4(void) { // CHECK: %[[G3_ADDR:.*]] = cir.get_global @_ZN4test5test22g3E : !cir.ptr // CHECK: %[[G3_VAL:.*]] = cir.load{{.*}} %[[G3_ADDR]] : !cir.ptr, !s32i // CHECK: %[[SUM2:.*]] = cir.binop(add, %[[SUM]], %[[G3_VAL]]) nsw : !s32i + +using test2::f3; +using test2::g3; + +int f5() { + f3(); + return g3; +} + +// CHECK: cir.func @_Z2f5v() +// CHECK: cir.call @_ZN4test5test22f3Ev() +// CHECK: %[[G3_ADDR:.*]] = cir.get_global @_ZN4test5test22g3E : !cir.ptr +// CHECK: %[[G3_VAL:.*]] = cir.load{{.*}} %[[G3_ADDR]] : !cir.ptr, !s32i + +namespace test3 { + struct S { + int a; + } s; +} + +using test3::s; + +int f6() { + return s.a; +} + +// CHECK: cir.func @_Z2f6v() +// CHECK: cir.get_global @_ZN5test31sE : !cir.ptr +// CHECK: cir.get_member %{{.*}}[0] {name = "a"} + +int shadowedFunc() { + return 3; +} + +namespace shadow { + using ::shadowedFunc; +} + +void f7() { + shadow::shadowedFunc(); +} + +// CHECK: cir.func @_Z2f7v()